@forgeroute/ui 0.4.6 → 0.4.8
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/fesm2022/forgeroute-ui-messaging.mjs +18 -4
- package/fesm2022/forgeroute-ui-messaging.mjs.map +1 -1
- package/fesm2022/forgeroute-ui-stripe.mjs +8 -3
- package/fesm2022/forgeroute-ui-stripe.mjs.map +1 -1
- package/fesm2022/forgeroute-ui.mjs +1643 -195
- package/fesm2022/forgeroute-ui.mjs.map +1 -1
- package/package.json +1 -1
- package/types/forgeroute-ui.d.ts +566 -13
package/types/forgeroute-ui.d.ts
CHANGED
|
@@ -980,6 +980,8 @@ export declare class SelectComponent implements ControlValueAccessor, Validator,
|
|
|
980
980
|
readonly errorMessage: import("@angular/core").Signal<string>;
|
|
981
981
|
/** Emits whenever the field becomes invalid / valid. */
|
|
982
982
|
readonly invalidChange: import("@angular/core").OutputEmitterRef<boolean>;
|
|
983
|
+
/** Emits the chosen value when the USER picks an option (the same value the form control receives; null for the blank option in number mode). Not emitted for values the host writes. */
|
|
984
|
+
readonly valueChange: import("@angular/core").OutputEmitterRef<string | number | null>;
|
|
983
985
|
protected readonly _activeError: import("@angular/core").Signal<string>;
|
|
984
986
|
private _onValidatorChange;
|
|
985
987
|
constructor();
|
|
@@ -1063,6 +1065,7 @@ export declare class SelectComponent implements ControlValueAccessor, Validator,
|
|
|
1063
1065
|
};
|
|
1064
1066
|
}, {
|
|
1065
1067
|
"invalidChange": "invalidChange";
|
|
1068
|
+
"valueChange": "valueChange";
|
|
1066
1069
|
}, never, never, true, never>;
|
|
1067
1070
|
}
|
|
1068
1071
|
export interface ImportFieldDef {
|
|
@@ -1988,6 +1991,12 @@ export declare class ToastService implements OnDestroy {
|
|
|
1988
1991
|
* (the input wins). Escape, pause on hover / focus and `dismiss()` work either way.
|
|
1989
1992
|
*/
|
|
1990
1993
|
readonly dismissible: import("@angular/core").WritableSignal<boolean>;
|
|
1994
|
+
/**
|
|
1995
|
+
* Opt-in: every `<ui-toast>` keeps always-present live regions and renders the message inside them (reliable screen-reader
|
|
1996
|
+
* announcements, VoiceOver / Safari included). Default `false`: toasts keep their own `role` exactly as before.
|
|
1997
|
+
* Set once per app with `provideForgerouteToast({ persistentLiveRegion: true })`, or per outlet with `<ui-toast [persistentLiveRegion]="true" />`.
|
|
1998
|
+
*/
|
|
1999
|
+
readonly persistentLiveRegion: import("@angular/core").WritableSignal<boolean>;
|
|
1991
2000
|
private _timer;
|
|
1992
2001
|
private _deadline;
|
|
1993
2002
|
private _remaining;
|
|
@@ -2023,6 +2032,15 @@ export declare class ToastComponent {
|
|
|
2023
2032
|
*/
|
|
2024
2033
|
readonly dismissible: import("@angular/core").InputSignal<boolean | null>;
|
|
2025
2034
|
protected readonly showClose: import("@angular/core").Signal<boolean>;
|
|
2035
|
+
/**
|
|
2036
|
+
* Opt-in: keep two always-present live regions (polite for success / info, assertive for errors) and put the toast inside the
|
|
2037
|
+
* matching one, instead of giving the toast its own role when it appears. A live region that already exists when its text
|
|
2038
|
+
* changes is announced reliably by VoiceOver / Safari; one inserted together with its text often is not. `null` (default) =
|
|
2039
|
+
* follow `ToastService.persistentLiveRegion` (`false` unless the app sets it with `provideForgerouteToast({ persistentLiveRegion: true })`);
|
|
2040
|
+
* `true` / `false` forces it for this outlet. Off = the markup and roles are exactly as they always were.
|
|
2041
|
+
*/
|
|
2042
|
+
readonly persistentLiveRegion: import("@angular/core").InputSignal<boolean | null>;
|
|
2043
|
+
protected readonly persistent: import("@angular/core").Signal<boolean>;
|
|
2026
2044
|
/**
|
|
2027
2045
|
* Message that was already on screen when this instance took over from a destroyed host. While it is
|
|
2028
2046
|
* unchanged the toast renders without the entry animation and without live-region roles, so the
|
|
@@ -2048,6 +2066,11 @@ export declare class ToastComponent {
|
|
|
2048
2066
|
"required": false;
|
|
2049
2067
|
"isSignal": true;
|
|
2050
2068
|
};
|
|
2069
|
+
"persistentLiveRegion": {
|
|
2070
|
+
"alias": "persistentLiveRegion";
|
|
2071
|
+
"required": false;
|
|
2072
|
+
"isSignal": true;
|
|
2073
|
+
};
|
|
2051
2074
|
}, {}, never, never, true, never>;
|
|
2052
2075
|
}
|
|
2053
2076
|
export type ProgressBarVariant = 'blue' | 'green' | 'amber' | 'red' | 'slate';
|
|
@@ -2072,6 +2095,8 @@ export declare class ProgressBarComponent {
|
|
|
2072
2095
|
readonly label: import("@angular/core").InputSignal<string>;
|
|
2073
2096
|
/** Optional fixed color override. Leave it out and the color follows completion (red / amber / blue / green). */
|
|
2074
2097
|
readonly variant: import("@angular/core").InputSignal<ProgressBarVariant | null | undefined>;
|
|
2098
|
+
/** Any CSS colour for the fill (e.g. the brand colour). Wins over `variant` and the completion bands; empty = the built-in colours. (Or set `--ui-progress-fill` / `--ui-accent` once in the app to recolour the blue band.) */
|
|
2099
|
+
readonly color: import("@angular/core").InputSignal<string>;
|
|
2075
2100
|
/** Hover / focus tooltip (library `uiTooltip`); `\n` starts a new line. */
|
|
2076
2101
|
readonly tooltip: import("@angular/core").InputSignal<string>;
|
|
2077
2102
|
readonly ariaLabel: import("@angular/core").InputSignal<string>;
|
|
@@ -2108,6 +2133,11 @@ export declare class ProgressBarComponent {
|
|
|
2108
2133
|
"required": false;
|
|
2109
2134
|
"isSignal": true;
|
|
2110
2135
|
};
|
|
2136
|
+
"color": {
|
|
2137
|
+
"alias": "color";
|
|
2138
|
+
"required": false;
|
|
2139
|
+
"isSignal": true;
|
|
2140
|
+
};
|
|
2111
2141
|
"tooltip": {
|
|
2112
2142
|
"alias": "tooltip";
|
|
2113
2143
|
"required": false;
|
|
@@ -2470,6 +2500,14 @@ export declare class CheckboxComponent implements ControlValueAccessor, Validato
|
|
|
2470
2500
|
readonly label: import("@angular/core").InputSignal<string>;
|
|
2471
2501
|
/** Accessible name for the native checkbox when there is no visible `label` (e.g. a table row's selector). */
|
|
2472
2502
|
readonly ariaLabel: import("@angular/core").InputSignal<string>;
|
|
2503
|
+
/** `data-testid` of the native checkbox (single mode), for end-to-end tests; none when empty. (Group options have their own `testId`.) */
|
|
2504
|
+
readonly testId: import("@angular/core").InputSignal<string>;
|
|
2505
|
+
/**
|
|
2506
|
+
* 1-6 makes the label text a real heading for screen readers (`role="heading"` + `aria-level`) while it stays the checkbox's label and
|
|
2507
|
+
* 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.
|
|
2508
|
+
* Default null: plain label text, exactly as before. Single mode only.
|
|
2509
|
+
*/
|
|
2510
|
+
readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 3 | 4 | 5 | 6 | null>;
|
|
2473
2511
|
readonly indeterminate: import("@angular/core").InputSignal<boolean>;
|
|
2474
2512
|
readonly checked: import("@angular/core").ModelSignal<boolean>;
|
|
2475
2513
|
/**
|
|
@@ -2567,6 +2605,16 @@ export declare class CheckboxComponent implements ControlValueAccessor, Validato
|
|
|
2567
2605
|
"required": false;
|
|
2568
2606
|
"isSignal": true;
|
|
2569
2607
|
};
|
|
2608
|
+
"testId": {
|
|
2609
|
+
"alias": "testId";
|
|
2610
|
+
"required": false;
|
|
2611
|
+
"isSignal": true;
|
|
2612
|
+
};
|
|
2613
|
+
"headingLevel": {
|
|
2614
|
+
"alias": "headingLevel";
|
|
2615
|
+
"required": false;
|
|
2616
|
+
"isSignal": true;
|
|
2617
|
+
};
|
|
2570
2618
|
"indeterminate": {
|
|
2571
2619
|
"alias": "indeterminate";
|
|
2572
2620
|
"required": false;
|
|
@@ -2737,6 +2785,13 @@ export interface StepperStep {
|
|
|
2737
2785
|
disabled?: boolean;
|
|
2738
2786
|
/** `true` or a message marks the step as failed ("!" indicator, red). A message string is shown under the label and announced. */
|
|
2739
2787
|
error?: boolean | string;
|
|
2788
|
+
/**
|
|
2789
|
+
* Overrides the state derived from the step's position. `true` = complete (check mark, selectable with `linear`) even
|
|
2790
|
+
* when the step comes after `current`; `false` = upcoming even when it comes before `current`. Omit to derive it from
|
|
2791
|
+
* the order. The current step always stays current. Use it when the user can jump back and keep the progress made:
|
|
2792
|
+
* mark every step the user has already completed `complete: true`.
|
|
2793
|
+
*/
|
|
2794
|
+
complete?: boolean;
|
|
2740
2795
|
}
|
|
2741
2796
|
export type StepperOrientation = 'horizontal' | 'vertical';
|
|
2742
2797
|
/**
|
|
@@ -2756,19 +2811,28 @@ export type StepperOrientation = 'horizontal' | 'vertical';
|
|
|
2756
2811
|
* steps = [{ key: 'info', label: 'Info' }, { key: 'pay', label: 'Payment', error: 'Card was declined' }, ...]
|
|
2757
2812
|
*
|
|
2758
2813
|
* `current` is two-way (`[(current)]`). An empty or unknown key means there is no current step: every step is upcoming
|
|
2759
|
-
*
|
|
2814
|
+
* unless it sets `complete: true`. `error` changes the indicator, not the state or `aria-current`.
|
|
2815
|
+
*
|
|
2816
|
+
* Per-step state: a step's `complete` flag overrides the position-derived state (see `StepperStep.complete`), so a wizard
|
|
2817
|
+
* that lets the user go back can keep the steps already done marked complete:
|
|
2818
|
+
*
|
|
2819
|
+
* steps = all.map((s, i) => ({ ...s, complete: i <= furthestReached }))
|
|
2760
2820
|
*
|
|
2761
2821
|
* Interaction (`clickable`): a selectable step is a native `<button>` (Tab / Enter / Space, visible focus ring). With
|
|
2762
|
-
* `linear` (default) only complete steps
|
|
2763
|
-
*
|
|
2764
|
-
* sets `current` (so `[(current)]` follows) and
|
|
2765
|
-
* unselectable
|
|
2822
|
+
* `linear` (default) only complete steps are selectable, so the user can go back but not skip ahead; with
|
|
2823
|
+
* `[linear]="false"` every non-disabled step is. The current step is never a button (you are already there): it is
|
|
2824
|
+
* plain text with `aria-current="step"`. Activating a selectable step sets `current` (so `[(current)]` follows) and
|
|
2825
|
+
* emits `stepClick` with its key; an unselectable step does nothing. Without `clickable` there are no buttons or tab
|
|
2826
|
+
* stops at all.
|
|
2766
2827
|
*
|
|
2767
2828
|
* Accessibility: an ordered list named by `ariaLabel`; the current step has `aria-current="step"`. Each step's name is
|
|
2768
2829
|
* "<label>, step N of M, completed | current step | not started" (+ ", optional", ", error: <message>", ", disabled"),
|
|
2769
2830
|
* built from visually hidden text so it is announced in the list even when the step is not a button. Indicators and
|
|
2770
2831
|
* connectors are decorative. A description is referenced with `aria-describedby`.
|
|
2771
2832
|
*
|
|
2833
|
+
* Theming: `accentColor` / `completeColor` (any CSS colour) recolour the current step, the complete steps and the filled
|
|
2834
|
+
* connectors; leave them out for the library blue. Or set `--ui-accent` (and `--ui-accent-soft`) once in the app.
|
|
2835
|
+
*
|
|
2772
2836
|
* Layout: `orientation` horizontal (row with connector lines that fill as steps complete) or vertical (column, connector
|
|
2773
2837
|
* on the left). Long labels wrap. At <= 480px a horizontal stepper with `labelsOnSmallScreens="current"` (default) shows
|
|
2774
2838
|
* only the current step's label (the others stay in the accessible name); `"all"` keeps them. Touch devices and phones
|
|
@@ -2785,6 +2849,10 @@ export declare class StepperComponent {
|
|
|
2785
2849
|
/** With `clickable`: `true` (default) = only complete steps and the current step are selectable; `false` = any enabled step. */
|
|
2786
2850
|
readonly linear: import("@angular/core").InputSignal<boolean>;
|
|
2787
2851
|
readonly size: import("@angular/core").InputSignal<"sm" | "md">;
|
|
2852
|
+
/** Accent colour (any CSS colour) of the current step and, unless `completeColor` is set, of complete steps and the filled connectors. Empty = the library blue (or `--ui-accent`). */
|
|
2853
|
+
readonly accentColor: import("@angular/core").InputSignal<string>;
|
|
2854
|
+
/** Colour (any CSS colour) of complete steps and the filled connectors, when it should differ from the current step's accent (e.g. green checks, orange current step). */
|
|
2855
|
+
readonly completeColor: import("@angular/core").InputSignal<string>;
|
|
2788
2856
|
/** Accessible name of the list. */
|
|
2789
2857
|
readonly ariaLabel: import("@angular/core").InputSignal<string>;
|
|
2790
2858
|
/** Horizontal, <= 480px: show only the current step's label (`'current'`, default) or every label (`'all'`). */
|
|
@@ -2840,6 +2908,16 @@ export declare class StepperComponent {
|
|
|
2840
2908
|
"required": false;
|
|
2841
2909
|
"isSignal": true;
|
|
2842
2910
|
};
|
|
2911
|
+
"accentColor": {
|
|
2912
|
+
"alias": "accentColor";
|
|
2913
|
+
"required": false;
|
|
2914
|
+
"isSignal": true;
|
|
2915
|
+
};
|
|
2916
|
+
"completeColor": {
|
|
2917
|
+
"alias": "completeColor";
|
|
2918
|
+
"required": false;
|
|
2919
|
+
"isSignal": true;
|
|
2920
|
+
};
|
|
2843
2921
|
"ariaLabel": {
|
|
2844
2922
|
"alias": "ariaLabel";
|
|
2845
2923
|
"required": false;
|
|
@@ -3033,6 +3111,8 @@ export interface RadioOption {
|
|
|
3033
3111
|
label: string;
|
|
3034
3112
|
description?: string;
|
|
3035
3113
|
disabled?: boolean;
|
|
3114
|
+
/** `data-testid` of this option's native radio input (e.g. for end-to-end tests); none when omitted. */
|
|
3115
|
+
testId?: string;
|
|
3036
3116
|
}
|
|
3037
3117
|
/**
|
|
3038
3118
|
* Group of native radio buttons inside a `<fieldset>` (+ `<legend>` = `label`), a ControlValueAccessor (string value, `''`
|
|
@@ -3936,6 +4016,8 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
|
|
|
3936
4016
|
readonly formatter: import("@angular/core").InputSignal<((raw: string) => string) | undefined>;
|
|
3937
4017
|
/** Reveal the built-in error messages now (e.g. after a failed Save click), without waiting for blur. */
|
|
3938
4018
|
readonly showErrors: import("@angular/core").InputSignal<boolean>;
|
|
4019
|
+
/** Emits the new value when the USER changes it (typing, paste, autofill) - the same value the form control receives. Not emitted for values the host writes. */
|
|
4020
|
+
readonly valueChange: import("@angular/core").OutputEmitterRef<string | number | null>;
|
|
3939
4021
|
readonly focused: import("@angular/core").OutputEmitterRef<void>;
|
|
3940
4022
|
readonly blurred: import("@angular/core").OutputEmitterRef<void>;
|
|
3941
4023
|
/** Emits whenever the field becomes invalid / valid. */
|
|
@@ -4096,6 +4178,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
|
|
|
4096
4178
|
"isSignal": true;
|
|
4097
4179
|
};
|
|
4098
4180
|
}, {
|
|
4181
|
+
"valueChange": "valueChange";
|
|
4099
4182
|
"focused": "focused";
|
|
4100
4183
|
"blurred": "blurred";
|
|
4101
4184
|
"invalidChange": "invalidChange";
|
|
@@ -4231,6 +4314,7 @@ export declare class TextareaInputComponent implements ControlValueAccessor, Val
|
|
|
4231
4314
|
}
|
|
4232
4315
|
export type TextSize = 'sm' | 'md' | 'lg';
|
|
4233
4316
|
export type TextTone = 'default' | 'muted';
|
|
4317
|
+
export type TextWeight = 'normal' | 'medium' | 'semibold' | 'bold';
|
|
4234
4318
|
/**
|
|
4235
4319
|
* Plain text that keeps its line breaks: a note, a message, an address, a pasted block. It is page content, not a form control —
|
|
4236
4320
|
* no tab stop, no resize handle, selectable and copyable, and read normally by screen readers (including browse mode).
|
|
@@ -4242,13 +4326,30 @@ export type TextTone = 'default' | 'muted';
|
|
|
4242
4326
|
* stretching the layout. The text is never interpreted as HTML. Pass the text through `[text]` (not as projected content),
|
|
4243
4327
|
* so the template's own indentation can never leak into it. An empty or missing text renders nothing.
|
|
4244
4328
|
*
|
|
4245
|
-
*
|
|
4329
|
+
* Inline emphasis without HTML: `strong` (a string or a list of strings) makes every occurrence of those exact snippets bold
|
|
4330
|
+
* (case-sensitive, longest first, never overlapping), e.g. `<ui-text text="Delivered to 12 Oak St, Peoria" strong="12 Oak St, Peoria" />`.
|
|
4331
|
+
* The text is still never parsed as HTML; `textContent` is unchanged (the snippets are wrapped in `<strong>`). Without `strong` the
|
|
4332
|
+
* markup is exactly what it always was.
|
|
4333
|
+
*
|
|
4334
|
+
* Inputs: `text`, `size` (sm 0.8125rem | md 0.875rem | lg 1rem, default md), `tone` (default slate | muted grey),
|
|
4335
|
+
* `weight` (normal | medium 500 | semibold 600 | bold 700, default normal - no font-weight is set, so the text is exactly as before;
|
|
4336
|
+
* use bold for a total such as "Balance Due").
|
|
4246
4337
|
*/
|
|
4247
4338
|
export declare class TextComponent {
|
|
4248
4339
|
/** The text to show. Line breaks are kept; it is never parsed as HTML. */
|
|
4249
4340
|
readonly text: import("@angular/core").InputSignal<string | null | undefined>;
|
|
4250
4341
|
readonly size: import("@angular/core").InputSignal<TextSize>;
|
|
4251
4342
|
readonly tone: import("@angular/core").InputSignal<TextTone>;
|
|
4343
|
+
/** Snippet(s) of `text` to show in bold. Empty / not found = no change. */
|
|
4344
|
+
readonly strong: import("@angular/core").InputSignal<string | string[] | null | undefined>;
|
|
4345
|
+
/** The text cut into plain and bold pieces; empty when nothing is to be bold (then the text renders as a single text node). */
|
|
4346
|
+
protected readonly segments: import("@angular/core").Signal<{
|
|
4347
|
+
text: string;
|
|
4348
|
+
strong: boolean;
|
|
4349
|
+
}[]>;
|
|
4350
|
+
/** normal (default) | medium | semibold | bold. Normal sets nothing, so existing text is unchanged. */
|
|
4351
|
+
readonly weight: import("@angular/core").InputSignal<TextWeight>;
|
|
4352
|
+
protected readonly fontWeight: import("@angular/core").Signal<string | null>;
|
|
4252
4353
|
protected readonly fontSize: import("@angular/core").Signal<string>;
|
|
4253
4354
|
static ɵfac: i0.ɵɵFactoryDeclaration<TextComponent, never>;
|
|
4254
4355
|
static ɵcmp: i0.ɵɵComponentDeclaration<TextComponent, "ui-text", never, {
|
|
@@ -4267,6 +4368,16 @@ export declare class TextComponent {
|
|
|
4267
4368
|
"required": false;
|
|
4268
4369
|
"isSignal": true;
|
|
4269
4370
|
};
|
|
4371
|
+
"strong": {
|
|
4372
|
+
"alias": "strong";
|
|
4373
|
+
"required": false;
|
|
4374
|
+
"isSignal": true;
|
|
4375
|
+
};
|
|
4376
|
+
"weight": {
|
|
4377
|
+
"alias": "weight";
|
|
4378
|
+
"required": false;
|
|
4379
|
+
"isSignal": true;
|
|
4380
|
+
};
|
|
4270
4381
|
}, {}, never, never, true, never>;
|
|
4271
4382
|
}
|
|
4272
4383
|
/** Why a chosen file was refused. */
|
|
@@ -4584,6 +4695,8 @@ export declare class DateInputComponent implements ControlValueAccessor, Validat
|
|
|
4584
4695
|
readonly errorMessage: import("@angular/core").Signal<string>;
|
|
4585
4696
|
/** Emits whenever the field becomes invalid / valid. */
|
|
4586
4697
|
readonly invalidChange: import("@angular/core").OutputEmitterRef<boolean>;
|
|
4698
|
+
/** Emits the new value ('YYYY-MM-DD', or '' when cleared) when the USER changes it - the same value the form control receives. Not emitted for values the host writes. */
|
|
4699
|
+
readonly valueChange: import("@angular/core").OutputEmitterRef<string>;
|
|
4587
4700
|
protected readonly _activeError: import("@angular/core").Signal<string>;
|
|
4588
4701
|
private _onValidatorChange;
|
|
4589
4702
|
constructor();
|
|
@@ -4645,6 +4758,7 @@ export declare class DateInputComponent implements ControlValueAccessor, Validat
|
|
|
4645
4758
|
};
|
|
4646
4759
|
}, {
|
|
4647
4760
|
"invalidChange": "invalidChange";
|
|
4761
|
+
"valueChange": "valueChange";
|
|
4648
4762
|
}, never, never, true, never>;
|
|
4649
4763
|
}
|
|
4650
4764
|
export declare class DatetimeInputComponent implements ControlValueAccessor, Validator, UiFieldValidity {
|
|
@@ -5327,6 +5441,55 @@ export declare class DropdownComponent {
|
|
|
5327
5441
|
"itemClick": "itemClick";
|
|
5328
5442
|
}, never, never, true, never>;
|
|
5329
5443
|
}
|
|
5444
|
+
/**
|
|
5445
|
+
* A real `<form>` for a group of library fields, so the browser (and assistive tech) treats it as one: it is announced as a
|
|
5446
|
+
* "form" landmark when it has a name, and pressing Enter in a field submits it through a `ui-button type="submit"`. Apps do not write
|
|
5447
|
+
* a native `<form>`; they use this.
|
|
5448
|
+
*
|
|
5449
|
+
* <ui-form ariaLabel="Informant contact details" (submitted)="save()">
|
|
5450
|
+
* <ui-text-input label="Name" [(ngModel)]="name" />
|
|
5451
|
+
* <ui-button type="submit">Save</ui-button>
|
|
5452
|
+
* </ui-form>
|
|
5453
|
+
*
|
|
5454
|
+
* Works with Reactive Forms: `<ui-form [formGroup]="form" ariaLabel="..." (ngSubmit)="save()">` (the `submit` event of the inner
|
|
5455
|
+
* form bubbles to the host, which is what `FormGroupDirective` listens to; it also stops the page from reloading).
|
|
5456
|
+
*
|
|
5457
|
+
* - `ariaLabel` (or `ariaLabelledby`): the form's name. A named form is a landmark, so give it one only for a main form of the page.
|
|
5458
|
+
* - The browser's own validation bubbles are off (`novalidate`): library inputs show their own messages.
|
|
5459
|
+
* - `submitted` emits the submit event after the default action (a page reload) was prevented.
|
|
5460
|
+
* - Layout: the host is a block and the form inside is a plain block - it adds no spacing; put a `ui-stack` / `ui-form-section` inside.
|
|
5461
|
+
*/
|
|
5462
|
+
export declare class FormComponent {
|
|
5463
|
+
/** The form's accessible name. Empty = unnamed (no landmark). */
|
|
5464
|
+
readonly ariaLabel: import("@angular/core").InputSignal<string>;
|
|
5465
|
+
/** Id of an element that names the form (wins over `ariaLabel`). */
|
|
5466
|
+
readonly ariaLabelledby: import("@angular/core").InputSignal<string>;
|
|
5467
|
+
/** Browser autofill for the whole form: 'on' | 'off'. Empty = the browser default. */
|
|
5468
|
+
readonly autocomplete: import("@angular/core").InputSignal<"" | "off" | "on">;
|
|
5469
|
+
/** Emits the submit event (Enter in a field, or a submit button). The page is never reloaded. */
|
|
5470
|
+
readonly submitted: import("@angular/core").OutputEmitterRef<Event>;
|
|
5471
|
+
protected onSubmit(event: Event): void;
|
|
5472
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<FormComponent, never>;
|
|
5473
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FormComponent, "ui-form", never, {
|
|
5474
|
+
"ariaLabel": {
|
|
5475
|
+
"alias": "ariaLabel";
|
|
5476
|
+
"required": false;
|
|
5477
|
+
"isSignal": true;
|
|
5478
|
+
};
|
|
5479
|
+
"ariaLabelledby": {
|
|
5480
|
+
"alias": "ariaLabelledby";
|
|
5481
|
+
"required": false;
|
|
5482
|
+
"isSignal": true;
|
|
5483
|
+
};
|
|
5484
|
+
"autocomplete": {
|
|
5485
|
+
"alias": "autocomplete";
|
|
5486
|
+
"required": false;
|
|
5487
|
+
"isSignal": true;
|
|
5488
|
+
};
|
|
5489
|
+
}, {
|
|
5490
|
+
"submitted": "submitted";
|
|
5491
|
+
}, never, ["*"], true, never>;
|
|
5492
|
+
}
|
|
5330
5493
|
export declare class FormSectionComponent {
|
|
5331
5494
|
readonly label: import("@angular/core").InputSignal<string>;
|
|
5332
5495
|
readonly divider: import("@angular/core").InputSignal<boolean>;
|
|
@@ -5345,7 +5508,7 @@ export declare class FormSectionComponent {
|
|
|
5345
5508
|
}, {}, never, ["*"], true, never>;
|
|
5346
5509
|
}
|
|
5347
5510
|
export declare class FormRowComponent {
|
|
5348
|
-
readonly cols: import("@angular/core").InputSignal<1 | 2 | 3>;
|
|
5511
|
+
readonly cols: import("@angular/core").InputSignal<1 | 2 | 3 | 4>;
|
|
5349
5512
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormRowComponent, never>;
|
|
5350
5513
|
static ɵcmp: i0.ɵɵComponentDeclaration<FormRowComponent, "ui-form-row", never, {
|
|
5351
5514
|
"cols": {
|
|
@@ -5521,12 +5684,14 @@ export declare class ListItemComponent {
|
|
|
5521
5684
|
*
|
|
5522
5685
|
* providers: [provideForgerouteToast()]
|
|
5523
5686
|
* providers: [provideForgerouteToast({ dismissible: true })] // every toast also gets a close button (default: none)
|
|
5687
|
+
* providers: [provideForgerouteToast({ persistentLiveRegion: true })] // always-present live regions: reliable announcements in VoiceOver / Safari
|
|
5524
5688
|
*
|
|
5525
5689
|
* It is created first, so it is the registry's host and any other `<ui-toast>` (a table's own, a shell's) stays silent: each
|
|
5526
5690
|
* message renders and is announced once. Nothing happens on the server. The outlet is destroyed with the app.
|
|
5527
5691
|
*/
|
|
5528
5692
|
export declare function provideForgerouteToast(options?: {
|
|
5529
5693
|
dismissible?: boolean;
|
|
5694
|
+
persistentLiveRegion?: boolean;
|
|
5530
5695
|
}): EnvironmentProviders;
|
|
5531
5696
|
/** Payload of `(reorder)`. Apply it with `reorderItems(items, order)` or take the ready-made `items`. */
|
|
5532
5697
|
export interface ListReorderEvent<T = unknown> {
|
|
@@ -5941,6 +6106,10 @@ export interface PanelInfoItem {
|
|
|
5941
6106
|
muted?: boolean;
|
|
5942
6107
|
danger?: boolean;
|
|
5943
6108
|
hidden?: boolean;
|
|
6109
|
+
/** Keep the line breaks of `value` (an address, a note); long lines still wrap. Plain values only. */
|
|
6110
|
+
multiline?: boolean;
|
|
6111
|
+
/** Bold row: the label and the value in the strong text colour and weight (a total, a balance due). */
|
|
6112
|
+
emphasis?: boolean;
|
|
5944
6113
|
}
|
|
5945
6114
|
export interface PanelInfoSection {
|
|
5946
6115
|
title?: string;
|
|
@@ -5965,6 +6134,12 @@ export interface PanelInfoSection {
|
|
|
5965
6134
|
export declare class PanelInfoListComponent {
|
|
5966
6135
|
readonly sections: import("@angular/core").InputSignal<PanelInfoSection[]>;
|
|
5967
6136
|
readonly showEmptyState: import("@angular/core").InputSignal<boolean>;
|
|
6137
|
+
/**
|
|
6138
|
+
* true = each row reads "Label: value" (a colon after the label and a real space, so `textContent` is "Label: value") with the value
|
|
6139
|
+
* next to the label instead of pushed to the right edge. Works with plain values, links (href / email / phone / link) and badges.
|
|
6140
|
+
* Default false = the label and value as before.
|
|
6141
|
+
*/
|
|
6142
|
+
readonly labelColon: import("@angular/core").InputSignal<boolean>;
|
|
5968
6143
|
readonly displaySections: import("@angular/core").Signal<PanelInfoSection[]>;
|
|
5969
6144
|
/**
|
|
5970
6145
|
* The safe href of an item, or null: `href` first, else `mailto:`/`tel:` built from `email`/`phone`. Only mailto, tel, http and https
|
|
@@ -5987,6 +6162,11 @@ export declare class PanelInfoListComponent {
|
|
|
5987
6162
|
"required": false;
|
|
5988
6163
|
"isSignal": true;
|
|
5989
6164
|
};
|
|
6165
|
+
"labelColon": {
|
|
6166
|
+
"alias": "labelColon";
|
|
6167
|
+
"required": false;
|
|
6168
|
+
"isSignal": true;
|
|
6169
|
+
};
|
|
5990
6170
|
}, {}, never, never, true, never>;
|
|
5991
6171
|
}
|
|
5992
6172
|
/**
|
|
@@ -6331,6 +6511,12 @@ export declare class AlertComponent {
|
|
|
6331
6511
|
readonly quiet: import("@angular/core").InputSignal<boolean>;
|
|
6332
6512
|
/** Tighter padding and a slightly smaller font, for an alert that is one row of a list. */
|
|
6333
6513
|
readonly compact: import("@angular/core").InputSignal<boolean>;
|
|
6514
|
+
/**
|
|
6515
|
+
* Inline body: the projected content flows as ONE line of text (wrapping normally) instead of a row of separate items, so inline
|
|
6516
|
+
* emphasis (`<strong>`), links and a small `ui-icon` stay inside the sentence: `<ui-alert [inline]="true">Delivered to <strong>12 Oak St</strong>.</ui-alert>`.
|
|
6517
|
+
* Default false: the body is a flex row with a gap, exactly as before (use it for text plus a button).
|
|
6518
|
+
*/
|
|
6519
|
+
readonly inline: import("@angular/core").InputSignal<boolean>;
|
|
6334
6520
|
readonly dismissed: import("@angular/core").OutputEmitterRef<void>;
|
|
6335
6521
|
static ɵfac: i0.ɵɵFactoryDeclaration<AlertComponent, never>;
|
|
6336
6522
|
static ɵcmp: i0.ɵɵComponentDeclaration<AlertComponent, "ui-alert", never, {
|
|
@@ -6359,6 +6545,11 @@ export declare class AlertComponent {
|
|
|
6359
6545
|
"required": false;
|
|
6360
6546
|
"isSignal": true;
|
|
6361
6547
|
};
|
|
6548
|
+
"inline": {
|
|
6549
|
+
"alias": "inline";
|
|
6550
|
+
"required": false;
|
|
6551
|
+
"isSignal": true;
|
|
6552
|
+
};
|
|
6362
6553
|
}, {
|
|
6363
6554
|
"dismissed": "dismissed";
|
|
6364
6555
|
}, never, ["*"], true, never>;
|
|
@@ -6366,7 +6557,7 @@ export declare class AlertComponent {
|
|
|
6366
6557
|
/** The SVG path (24×24 stroke icon) for an icon key, or undefined when the key is unknown. */
|
|
6367
6558
|
export declare function iconPath(name: string): string | undefined;
|
|
6368
6559
|
/** Keys with an icon of their own (the data-table action keys are accepted too — see `builtInActionIcon`). */
|
|
6369
|
-
export type IconName = 'add' | 'close' | 'check' | 'upload' | 'image' | 'chevron-up' | 'chevron-down' | 'arrow-left' | 'bell' | 'print' | 'lock' | 'arrow-up' | 'arrow-down' | 'arrow-right' | 'document' | 'grip' | 'card' | 'bank' | 'view' | 'edit' | 'delete' | 'download' | 'duplicate' | 'archive' | 'restore' | 'share' | 'email' | 'message' | 'call';
|
|
6560
|
+
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' | 'edit' | 'delete' | 'download' | 'duplicate' | 'archive' | 'restore' | 'share' | 'email' | 'message' | 'call';
|
|
6370
6561
|
/**
|
|
6371
6562
|
* A clickable icon. The host passes a key (`name="delete"`) and the library draws that icon; clicking it emits
|
|
6372
6563
|
* `iconClick`, and the host does the actual work (delete the row, open a panel, …).
|
|
@@ -6451,23 +6642,36 @@ export declare class IconComponent {
|
|
|
6451
6642
|
}, never, never, true, never>;
|
|
6452
6643
|
}
|
|
6453
6644
|
export type TimelineTone = 'default' | 'success' | 'warning' | 'danger';
|
|
6645
|
+
/** A badge of a timeline item. `tooltip` shows on hover and keyboard focus (the badge becomes focusable); `testId` is its `data-testid`. */
|
|
6646
|
+
export interface TimelineBadge {
|
|
6647
|
+
label: string;
|
|
6648
|
+
variant: BadgeVariant;
|
|
6649
|
+
tooltip?: string;
|
|
6650
|
+
testId?: string;
|
|
6651
|
+
}
|
|
6454
6652
|
export interface TimelineItem {
|
|
6455
6653
|
/** Stable id used for `track`; the index is used when absent. */
|
|
6456
6654
|
id?: string;
|
|
6655
|
+
/** `data-testid` of the `<li>`. */
|
|
6656
|
+
testId?: string;
|
|
6457
6657
|
title: string;
|
|
6458
6658
|
description?: string;
|
|
6459
6659
|
/** Pre-formatted time text shown to the reader, e.g. "Oct 20, 2026, 3:15 PM". */
|
|
6460
6660
|
time?: string;
|
|
6461
6661
|
/** ISO date / date-time for the `datetime` attribute of the `<time>` element (machine-readable). */
|
|
6462
6662
|
dateTime?: string;
|
|
6463
|
-
badge?:
|
|
6464
|
-
|
|
6465
|
-
|
|
6466
|
-
};
|
|
6663
|
+
badge?: TimelineBadge;
|
|
6664
|
+
/** Any number of badges, shown after `badge` (if also set), in order. They wrap onto the next line when the row is narrow. */
|
|
6665
|
+
badges?: TimelineBadge[];
|
|
6467
6666
|
/** Icon drawn inside the dot (static, decorative). Unknown names draw nothing. */
|
|
6468
6667
|
icon?: IconName | (string & {});
|
|
6469
6668
|
/** Colour of the dot / icon. Default `default`. */
|
|
6470
6669
|
tone?: TimelineTone;
|
|
6670
|
+
/**
|
|
6671
|
+
* Colours the dot / icon with a badge colour (any `BadgeVariant`): the solid dot is the badge's own dark shade (`BADGE_VARIANT_STYLES[v].color`,
|
|
6672
|
+
* at least 3:1 on white, so the dot and a white icon on it are readable). Overrides `tone`; without it `tone` works as before.
|
|
6673
|
+
*/
|
|
6674
|
+
dotVariant?: BadgeVariant;
|
|
6471
6675
|
}
|
|
6472
6676
|
/**
|
|
6473
6677
|
* Vertical activity feed: an ordered list of events joined by a line, each with a dot (or icon), title, optional badge,
|
|
@@ -6487,6 +6691,12 @@ export declare class TimelineComponent {
|
|
|
6487
6691
|
readonly ariaLabel: import("@angular/core").InputSignal<string>;
|
|
6488
6692
|
/** Shown (as a hint) when there are no items. Empty = render nothing. */
|
|
6489
6693
|
readonly emptyMessage: import("@angular/core").InputSignal<string>;
|
|
6694
|
+
/** Any CSS length (e.g. `600px`). When set, the list scrolls inside a keyboard-focusable region of at most this height. Empty = no wrapper. */
|
|
6695
|
+
readonly maxHeight: import("@angular/core").InputSignal<string>;
|
|
6696
|
+
/** `below` (default): the time is under the title / description. `end`: the time sits right-aligned on the title row. */
|
|
6697
|
+
readonly timePosition: import("@angular/core").InputSignal<"end" | "below">;
|
|
6698
|
+
/** Solid dot colour of an item's `dotVariant`, or null (then `tone` colours it). */
|
|
6699
|
+
dotColor(item: TimelineItem): string | null;
|
|
6490
6700
|
static ɵfac: i0.ɵɵFactoryDeclaration<TimelineComponent, never>;
|
|
6491
6701
|
static ɵcmp: i0.ɵɵComponentDeclaration<TimelineComponent, "ui-timeline", never, {
|
|
6492
6702
|
"items": {
|
|
@@ -6504,6 +6714,16 @@ export declare class TimelineComponent {
|
|
|
6504
6714
|
"required": false;
|
|
6505
6715
|
"isSignal": true;
|
|
6506
6716
|
};
|
|
6717
|
+
"maxHeight": {
|
|
6718
|
+
"alias": "maxHeight";
|
|
6719
|
+
"required": false;
|
|
6720
|
+
"isSignal": true;
|
|
6721
|
+
};
|
|
6722
|
+
"timePosition": {
|
|
6723
|
+
"alias": "timePosition";
|
|
6724
|
+
"required": false;
|
|
6725
|
+
"isSignal": true;
|
|
6726
|
+
};
|
|
6507
6727
|
}, {}, never, never, true, never>;
|
|
6508
6728
|
}
|
|
6509
6729
|
/**
|
|
@@ -6602,6 +6822,284 @@ export declare class ImagePreviewComponent {
|
|
|
6602
6822
|
};
|
|
6603
6823
|
}, {}, never, never, true, never>;
|
|
6604
6824
|
}
|
|
6825
|
+
export type ImageFit = 'contain' | 'cover' | 'fill' | 'scale-down';
|
|
6826
|
+
export type ImageRadius = 'none' | 'sm' | 'md' | 'lg' | 'full';
|
|
6827
|
+
export type ImageAlign = 'start' | 'center' | 'end';
|
|
6828
|
+
/**
|
|
6829
|
+
* A content image of any size (a logo, a product photo, a banner) - the bigger sibling of `ui-image-preview`, which is a
|
|
6830
|
+
* small fixed-size thumbnail. The whole image is shown (`fit="contain"`) unless you ask for `cover`.
|
|
6831
|
+
*
|
|
6832
|
+
* <ui-image src="/logo.png" alt="Peaceful Pines Crematory" maxHeight="48px" /> <!-- natural size, capped -->
|
|
6833
|
+
* <ui-image [src]="p.imageUrl" [alt]="p.name" width="100%" aspectRatio="4 / 3" radius="md" [bordered]="true" />
|
|
6834
|
+
* <ui-image [src]="hero" alt="" fit="cover" width="100%" height="200px" [priority]="true" />
|
|
6835
|
+
*
|
|
6836
|
+
* - `alt`: required for meaningful images; '' (default) marks it decorative. The placeholder is `role="img"` named by `alt`
|
|
6837
|
+
* (or hidden when decorative).
|
|
6838
|
+
* - Size: `width` / `height` (CSS lengths, e.g. "200px", "100%") fix the box and the image fills it per `fit`; without them
|
|
6839
|
+
* the image keeps its natural size, capped by `maxWidth` (default 100%) and `maxHeight`. `aspectRatio` ("4 / 3", "1")
|
|
6840
|
+
* reserves the space before the image loads so the page does not jump.
|
|
6841
|
+
* - `radius` none | sm | md | lg | full, `bordered`, `align` (start | center | end, for an image narrower than its row).
|
|
6842
|
+
* - `placeholder` (default true): a neutral icon in the same box when there is no `src` or it fails to load. false renders nothing then.
|
|
6843
|
+
* - `priority`: above-the-fold image - loads eagerly with high fetch priority. Otherwise `loading="lazy"` and async decoding.
|
|
6844
|
+
* - Outputs `loaded` and `failed`. A new `src` (or a changed `retryKey`) gets a fresh chance to load.
|
|
6845
|
+
*/
|
|
6846
|
+
export declare class ImageComponent {
|
|
6847
|
+
/** Image URL (or data URL). Blank shows the placeholder. */
|
|
6848
|
+
readonly src: import("@angular/core").InputSignal<string | null | undefined>;
|
|
6849
|
+
/** Alt text; '' (default) marks the image decorative. */
|
|
6850
|
+
readonly alt: import("@angular/core").InputSignal<string>;
|
|
6851
|
+
readonly fit: import("@angular/core").InputSignal<ImageFit>;
|
|
6852
|
+
/** CSS width of the box (e.g. "200px", "100%"). Empty = natural width. */
|
|
6853
|
+
readonly width: import("@angular/core").InputSignal<string>;
|
|
6854
|
+
/** CSS height of the box. Empty = natural height. */
|
|
6855
|
+
readonly height: import("@angular/core").InputSignal<string>;
|
|
6856
|
+
readonly maxWidth: import("@angular/core").InputSignal<string>;
|
|
6857
|
+
readonly maxHeight: import("@angular/core").InputSignal<string>;
|
|
6858
|
+
/** CSS aspect-ratio, e.g. "4 / 3". Reserves the space while the image loads. */
|
|
6859
|
+
readonly aspectRatio: import("@angular/core").InputSignal<string>;
|
|
6860
|
+
readonly radius: import("@angular/core").InputSignal<ImageRadius>;
|
|
6861
|
+
readonly bordered: import("@angular/core").InputSignal<boolean>;
|
|
6862
|
+
readonly align: import("@angular/core").InputSignal<ImageAlign>;
|
|
6863
|
+
/** Show a neutral placeholder when there is no usable image. false = render nothing. */
|
|
6864
|
+
readonly placeholder: import("@angular/core").InputSignal<boolean>;
|
|
6865
|
+
/** Above-the-fold image: eager loading with high fetch priority. */
|
|
6866
|
+
readonly priority: import("@angular/core").InputSignal<boolean>;
|
|
6867
|
+
/** Bump to retry a failed image with the same `src`. */
|
|
6868
|
+
readonly retryKey: import("@angular/core").InputSignal<unknown>;
|
|
6869
|
+
readonly loaded: import("@angular/core").OutputEmitterRef<void>;
|
|
6870
|
+
readonly failed: import("@angular/core").OutputEmitterRef<void>;
|
|
6871
|
+
protected readonly _failed: import("@angular/core").WritableSignal<boolean>;
|
|
6872
|
+
protected readonly _url: import("@angular/core").Signal<string | null>;
|
|
6873
|
+
protected readonly radiusCss: import("@angular/core").Signal<string>;
|
|
6874
|
+
protected readonly imgWidth: import("@angular/core").Signal<string | null>;
|
|
6875
|
+
protected readonly imgHeight: import("@angular/core").Signal<string | null>;
|
|
6876
|
+
/** The placeholder needs a real box when the caller gave none. */
|
|
6877
|
+
protected readonly boxWidth: import("@angular/core").Signal<string | null>;
|
|
6878
|
+
protected readonly boxHeight: import("@angular/core").Signal<string | null>;
|
|
6879
|
+
protected readonly isBlock: import("@angular/core").Signal<boolean>;
|
|
6880
|
+
constructor();
|
|
6881
|
+
protected _onError(): void;
|
|
6882
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ImageComponent, never>;
|
|
6883
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ImageComponent, "ui-image", never, {
|
|
6884
|
+
"src": {
|
|
6885
|
+
"alias": "src";
|
|
6886
|
+
"required": false;
|
|
6887
|
+
"isSignal": true;
|
|
6888
|
+
};
|
|
6889
|
+
"alt": {
|
|
6890
|
+
"alias": "alt";
|
|
6891
|
+
"required": false;
|
|
6892
|
+
"isSignal": true;
|
|
6893
|
+
};
|
|
6894
|
+
"fit": {
|
|
6895
|
+
"alias": "fit";
|
|
6896
|
+
"required": false;
|
|
6897
|
+
"isSignal": true;
|
|
6898
|
+
};
|
|
6899
|
+
"width": {
|
|
6900
|
+
"alias": "width";
|
|
6901
|
+
"required": false;
|
|
6902
|
+
"isSignal": true;
|
|
6903
|
+
};
|
|
6904
|
+
"height": {
|
|
6905
|
+
"alias": "height";
|
|
6906
|
+
"required": false;
|
|
6907
|
+
"isSignal": true;
|
|
6908
|
+
};
|
|
6909
|
+
"maxWidth": {
|
|
6910
|
+
"alias": "maxWidth";
|
|
6911
|
+
"required": false;
|
|
6912
|
+
"isSignal": true;
|
|
6913
|
+
};
|
|
6914
|
+
"maxHeight": {
|
|
6915
|
+
"alias": "maxHeight";
|
|
6916
|
+
"required": false;
|
|
6917
|
+
"isSignal": true;
|
|
6918
|
+
};
|
|
6919
|
+
"aspectRatio": {
|
|
6920
|
+
"alias": "aspectRatio";
|
|
6921
|
+
"required": false;
|
|
6922
|
+
"isSignal": true;
|
|
6923
|
+
};
|
|
6924
|
+
"radius": {
|
|
6925
|
+
"alias": "radius";
|
|
6926
|
+
"required": false;
|
|
6927
|
+
"isSignal": true;
|
|
6928
|
+
};
|
|
6929
|
+
"bordered": {
|
|
6930
|
+
"alias": "bordered";
|
|
6931
|
+
"required": false;
|
|
6932
|
+
"isSignal": true;
|
|
6933
|
+
};
|
|
6934
|
+
"align": {
|
|
6935
|
+
"alias": "align";
|
|
6936
|
+
"required": false;
|
|
6937
|
+
"isSignal": true;
|
|
6938
|
+
};
|
|
6939
|
+
"placeholder": {
|
|
6940
|
+
"alias": "placeholder";
|
|
6941
|
+
"required": false;
|
|
6942
|
+
"isSignal": true;
|
|
6943
|
+
};
|
|
6944
|
+
"priority": {
|
|
6945
|
+
"alias": "priority";
|
|
6946
|
+
"required": false;
|
|
6947
|
+
"isSignal": true;
|
|
6948
|
+
};
|
|
6949
|
+
"retryKey": {
|
|
6950
|
+
"alias": "retryKey";
|
|
6951
|
+
"required": false;
|
|
6952
|
+
"isSignal": true;
|
|
6953
|
+
};
|
|
6954
|
+
}, {
|
|
6955
|
+
"loaded": "loaded";
|
|
6956
|
+
"failed": "failed";
|
|
6957
|
+
}, never, never, true, never>;
|
|
6958
|
+
}
|
|
6959
|
+
/** One picture of a `ui-image-gallery`. */
|
|
6960
|
+
export interface GalleryImage {
|
|
6961
|
+
src: string;
|
|
6962
|
+
/** Alt text of this picture. Defaults to "Image N of M". */
|
|
6963
|
+
alt?: string;
|
|
6964
|
+
}
|
|
6965
|
+
/**
|
|
6966
|
+
* Image gallery (a "slideshow"): one large picture with previous / next buttons, a counter and dots. Put it inside a
|
|
6967
|
+
* `ui-modal` for a lightbox, or inline on a page.
|
|
6968
|
+
*
|
|
6969
|
+
* <ui-image-gallery [images]="[{ src: a, alt: 'Front' }, { src: b, alt: 'Side' }]" [(index)]="i" ariaLabel="Photos of the urn" />
|
|
6970
|
+
*
|
|
6971
|
+
* - `images`: the pictures. With a single picture there are no buttons, counter or dots.
|
|
6972
|
+
* - `index` (two-way, default 0): the shown picture; values outside the list are clamped.
|
|
6973
|
+
* - `loop` (default true): Next after the last goes to the first, Previous before the first to the last. false disables
|
|
6974
|
+
* the button at either end.
|
|
6975
|
+
* - `showDots` / `showCounter` (default true), `aspectRatio` (default "4 / 3"), `maxHeight` (default "70vh"), `fit` (default contain).
|
|
6976
|
+
* - Keyboard: with focus inside the gallery, ArrowLeft / ArrowRight (and Home / End) change the picture. The picture
|
|
6977
|
+
* change is announced ("Image 2 of 5: <alt>") through an always-present live region.
|
|
6978
|
+
* - Accessibility: a labelled group (`ariaLabel`, default "Image gallery") described as a carousel; the buttons are named
|
|
6979
|
+
* "Previous image" / "Next image"; each dot is a button "Show image N of M" with `aria-current` on the shown one.
|
|
6980
|
+
*/
|
|
6981
|
+
export declare class ImageGalleryComponent {
|
|
6982
|
+
readonly images: import("@angular/core").InputSignal<GalleryImage[]>;
|
|
6983
|
+
/** Shown picture (0-based). Two-way. */
|
|
6984
|
+
readonly index: import("@angular/core").ModelSignal<number>;
|
|
6985
|
+
readonly loop: import("@angular/core").InputSignal<boolean>;
|
|
6986
|
+
readonly showDots: import("@angular/core").InputSignal<boolean>;
|
|
6987
|
+
readonly showCounter: import("@angular/core").InputSignal<boolean>;
|
|
6988
|
+
readonly aspectRatio: import("@angular/core").InputSignal<string>;
|
|
6989
|
+
readonly maxHeight: import("@angular/core").InputSignal<string>;
|
|
6990
|
+
readonly fit: import("@angular/core").InputSignal<"contain" | "cover">;
|
|
6991
|
+
readonly ariaLabel: import("@angular/core").InputSignal<string>;
|
|
6992
|
+
protected readonly count: import("@angular/core").Signal<number>;
|
|
6993
|
+
/** `index` clamped into the list. */
|
|
6994
|
+
protected readonly position: import("@angular/core").Signal<number>;
|
|
6995
|
+
protected readonly current: import("@angular/core").Signal<GalleryImage>;
|
|
6996
|
+
protected readonly currentAlt: import("@angular/core").Signal<string>;
|
|
6997
|
+
protected readonly canPrev: import("@angular/core").Signal<boolean>;
|
|
6998
|
+
protected readonly canNext: import("@angular/core").Signal<boolean>;
|
|
6999
|
+
protected readonly announcement: import("@angular/core").Signal<string>;
|
|
7000
|
+
prev(): void;
|
|
7001
|
+
next(): void;
|
|
7002
|
+
go(i: number): void;
|
|
7003
|
+
protected onKey(e: KeyboardEvent): void;
|
|
7004
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ImageGalleryComponent, never>;
|
|
7005
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ImageGalleryComponent, "ui-image-gallery", never, {
|
|
7006
|
+
"images": {
|
|
7007
|
+
"alias": "images";
|
|
7008
|
+
"required": false;
|
|
7009
|
+
"isSignal": true;
|
|
7010
|
+
};
|
|
7011
|
+
"index": {
|
|
7012
|
+
"alias": "index";
|
|
7013
|
+
"required": false;
|
|
7014
|
+
"isSignal": true;
|
|
7015
|
+
};
|
|
7016
|
+
"loop": {
|
|
7017
|
+
"alias": "loop";
|
|
7018
|
+
"required": false;
|
|
7019
|
+
"isSignal": true;
|
|
7020
|
+
};
|
|
7021
|
+
"showDots": {
|
|
7022
|
+
"alias": "showDots";
|
|
7023
|
+
"required": false;
|
|
7024
|
+
"isSignal": true;
|
|
7025
|
+
};
|
|
7026
|
+
"showCounter": {
|
|
7027
|
+
"alias": "showCounter";
|
|
7028
|
+
"required": false;
|
|
7029
|
+
"isSignal": true;
|
|
7030
|
+
};
|
|
7031
|
+
"aspectRatio": {
|
|
7032
|
+
"alias": "aspectRatio";
|
|
7033
|
+
"required": false;
|
|
7034
|
+
"isSignal": true;
|
|
7035
|
+
};
|
|
7036
|
+
"maxHeight": {
|
|
7037
|
+
"alias": "maxHeight";
|
|
7038
|
+
"required": false;
|
|
7039
|
+
"isSignal": true;
|
|
7040
|
+
};
|
|
7041
|
+
"fit": {
|
|
7042
|
+
"alias": "fit";
|
|
7043
|
+
"required": false;
|
|
7044
|
+
"isSignal": true;
|
|
7045
|
+
};
|
|
7046
|
+
"ariaLabel": {
|
|
7047
|
+
"alias": "ariaLabel";
|
|
7048
|
+
"required": false;
|
|
7049
|
+
"isSignal": true;
|
|
7050
|
+
};
|
|
7051
|
+
}, {
|
|
7052
|
+
"index": "indexChange";
|
|
7053
|
+
}, never, never, true, never>;
|
|
7054
|
+
}
|
|
7055
|
+
export type LiveRegionPoliteness = 'polite' | 'assertive';
|
|
7056
|
+
/**
|
|
7057
|
+
* A screen-reader announcement area. The element is always in the DOM and only its text changes, which is what makes
|
|
7058
|
+
* assistive tech (VoiceOver / Safari included) announce reliably - a live region that is inserted together with its text
|
|
7059
|
+
* often is not announced.
|
|
7060
|
+
*
|
|
7061
|
+
* <ui-live-region [message]="announcement()" /> <!-- "Step 3 of 5: Deceased" -->
|
|
7062
|
+
* <ui-live-region [message]="error()" politeness="assertive" /> <!-- role="alert" -->
|
|
7063
|
+
* <ui-live-region [message]="status()" [visible]="true" /> <!-- also shown on screen -->
|
|
7064
|
+
*
|
|
7065
|
+
* By default it is visually hidden (still read aloud). `politeness` "polite" (default, `role="status"`) waits for the
|
|
7066
|
+
* user to be idle; "assertive" (`role="alert"`) interrupts. `atomic` (default true) reads the whole message again when it
|
|
7067
|
+
* changes. Set the message to '' to clear it. Announcing the same text twice in a row needs a different message in
|
|
7068
|
+
* between (for example clear it first); screen readers ignore an unchanged region.
|
|
7069
|
+
*/
|
|
7070
|
+
export declare class LiveRegionComponent {
|
|
7071
|
+
/** The text to announce. */
|
|
7072
|
+
readonly message: import("@angular/core").InputSignal<string>;
|
|
7073
|
+
readonly politeness: import("@angular/core").InputSignal<LiveRegionPoliteness>;
|
|
7074
|
+
/** Read the whole message (not just the changed part) when it changes. */
|
|
7075
|
+
readonly atomic: import("@angular/core").InputSignal<boolean>;
|
|
7076
|
+
/** Show the text on screen too. Default false: visually hidden, still announced. */
|
|
7077
|
+
readonly visible: import("@angular/core").InputSignal<boolean>;
|
|
7078
|
+
protected readonly role: import("@angular/core").Signal<"status" | "alert">;
|
|
7079
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<LiveRegionComponent, never>;
|
|
7080
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<LiveRegionComponent, "ui-live-region", never, {
|
|
7081
|
+
"message": {
|
|
7082
|
+
"alias": "message";
|
|
7083
|
+
"required": false;
|
|
7084
|
+
"isSignal": true;
|
|
7085
|
+
};
|
|
7086
|
+
"politeness": {
|
|
7087
|
+
"alias": "politeness";
|
|
7088
|
+
"required": false;
|
|
7089
|
+
"isSignal": true;
|
|
7090
|
+
};
|
|
7091
|
+
"atomic": {
|
|
7092
|
+
"alias": "atomic";
|
|
7093
|
+
"required": false;
|
|
7094
|
+
"isSignal": true;
|
|
7095
|
+
};
|
|
7096
|
+
"visible": {
|
|
7097
|
+
"alias": "visible";
|
|
7098
|
+
"required": false;
|
|
7099
|
+
"isSignal": true;
|
|
7100
|
+
};
|
|
7101
|
+
}, {}, never, never, true, never>;
|
|
7102
|
+
}
|
|
6605
7103
|
/**
|
|
6606
7104
|
* Inline field error for controls that have no `error` input of their own — e.g. an app-specific
|
|
6607
7105
|
* picker. Renders exactly like the library inputs' own field error (small red text under the field,
|
|
@@ -6998,6 +7496,8 @@ export declare class RadioComponent {
|
|
|
6998
7496
|
readonly description: import("@angular/core").InputSignal<string>;
|
|
6999
7497
|
/** Accessible name when there is no visible `label`. */
|
|
7000
7498
|
readonly ariaLabel: import("@angular/core").InputSignal<string>;
|
|
7499
|
+
/** `data-testid` of the native radio input; none when empty. */
|
|
7500
|
+
readonly testId: import("@angular/core").InputSignal<string>;
|
|
7001
7501
|
readonly value: import("@angular/core").InputSignal<string>;
|
|
7002
7502
|
/** Radios with the same `name` form one keyboard (arrow key) group. */
|
|
7003
7503
|
readonly name: import("@angular/core").InputSignal<string>;
|
|
@@ -7039,6 +7539,11 @@ export declare class RadioComponent {
|
|
|
7039
7539
|
"required": false;
|
|
7040
7540
|
"isSignal": true;
|
|
7041
7541
|
};
|
|
7542
|
+
"testId": {
|
|
7543
|
+
"alias": "testId";
|
|
7544
|
+
"required": false;
|
|
7545
|
+
"isSignal": true;
|
|
7546
|
+
};
|
|
7042
7547
|
"value": {
|
|
7043
7548
|
"alias": "value";
|
|
7044
7549
|
"required": false;
|
|
@@ -7540,7 +8045,10 @@ export declare class PdfHotspotComponent {
|
|
|
7540
8045
|
* - `<div card-header-leading>`: something before the title block, such as a logo or an icon.
|
|
7541
8046
|
* - `<ng-container card-header>`: your own header content, shown under the title (or instead of it when no title is set).
|
|
7542
8047
|
* - `<ng-container card-header-action>`: buttons or links on the right side of the header.
|
|
7543
|
-
* - `showEdit` + `editLabel` + `(editClick)`: the built-in Edit button.
|
|
8048
|
+
* - `showEdit` + `editLabel` + `(editClick)`: the built-in Edit button. `editAriaLabel` gives it a longer accessible name
|
|
8049
|
+
* ("Edit informant information") when the visible label alone is ambiguous; it should contain the visible label.
|
|
8050
|
+
* - `fill`: the card stretches to the height of its container (a grid cell or flex item) and its body grows, so cards in
|
|
8051
|
+
* one row end at the same height; the default card is only as tall as its content.
|
|
7544
8052
|
* - `background`: the card's background colour (any CSS colour; default white).
|
|
7545
8053
|
* - `textColor`: the colour of the title, subtitle, chevron and body text (any CSS colour; default: the normal slate colours). Use it for light text on a dark `background`. Text you colour yourself inside the body keeps its own colour.
|
|
7546
8054
|
* - The body has built-in padding (16px 18px, matching the header's 18px side padding); there is no padding input.
|
|
@@ -7586,6 +8094,10 @@ export declare class DetailCardComponent {
|
|
|
7586
8094
|
readonly showEdit: import("@angular/core").InputSignal<boolean>;
|
|
7587
8095
|
readonly editLabel: import("@angular/core").InputSignal<string>;
|
|
7588
8096
|
readonly editClick: import("@angular/core").OutputEmitterRef<void>;
|
|
8097
|
+
/** Accessible name of the Edit button, e.g. "Edit informant information". Empty = the visible `editLabel`. */
|
|
8098
|
+
readonly editAriaLabel: import("@angular/core").InputSignal<string>;
|
|
8099
|
+
/** true = the card fills the height of its container so sibling cards line up; the body grows. Default false: unchanged. */
|
|
8100
|
+
readonly fill: import("@angular/core").InputSignal<boolean>;
|
|
7589
8101
|
/** The group's aria-label: the visible title (unless `titleId` names the card instead), else `ariaLabel`, else none. */
|
|
7590
8102
|
groupLabel(): string | null;
|
|
7591
8103
|
/** The body is open unless the card has a header that is collapsible and was collapsed. */
|
|
@@ -7660,6 +8172,16 @@ export declare class DetailCardComponent {
|
|
|
7660
8172
|
"required": false;
|
|
7661
8173
|
"isSignal": true;
|
|
7662
8174
|
};
|
|
8175
|
+
"editAriaLabel": {
|
|
8176
|
+
"alias": "editAriaLabel";
|
|
8177
|
+
"required": false;
|
|
8178
|
+
"isSignal": true;
|
|
8179
|
+
};
|
|
8180
|
+
"fill": {
|
|
8181
|
+
"alias": "fill";
|
|
8182
|
+
"required": false;
|
|
8183
|
+
"isSignal": true;
|
|
8184
|
+
};
|
|
7663
8185
|
}, {
|
|
7664
8186
|
"expanded": "expandedChange";
|
|
7665
8187
|
"editClick": "editClick";
|
|
@@ -8079,6 +8601,12 @@ export type ColumnsAlign = 'start' | 'center' | 'stretch';
|
|
|
8079
8601
|
* - `collapseAt`: sm (480px) | md (768px) | lg (1024px) | never. Below that viewport width the columns become one.
|
|
8080
8602
|
* Plain media queries are used (not container queries) because they behave the same in every supported browser.
|
|
8081
8603
|
* - `align`: start | center | stretch (default start) - how cells of different heights line up.
|
|
8604
|
+
* - Responsive tiers (optional): `countBelowLg` (viewport <= 1024px), `countBelowMd` (<= 768px) and `countBelowSm` (<= 480px)
|
|
8605
|
+
* give a different column count (1-4) at narrower widths. Each tier falls back to the next wider one, then to `count`, so
|
|
8606
|
+
* a grid that sets none of them is unchanged. `collapseAt` is applied last: a width at or below it is one column.
|
|
8607
|
+
* A product grid of 1 column on phones, 2 on tablets and 3 on desktop:
|
|
8608
|
+
* <ui-columns [count]="3" [countBelowLg]="2" collapseAt="md" gap="md"> ... </ui-columns>
|
|
8609
|
+
* The same grid with 2 columns from phone width up (no stacking): `[count]="3" [countBelowLg]="2" collapseAt="never"`.
|
|
8082
8610
|
*
|
|
8083
8611
|
* <ui-columns>
|
|
8084
8612
|
* <ui-form-section label="Email"> ... </ui-form-section>
|
|
@@ -8091,7 +8619,17 @@ export declare class ColumnsComponent {
|
|
|
8091
8619
|
readonly gap: import("@angular/core").InputSignal<string>;
|
|
8092
8620
|
readonly collapseAt: import("@angular/core").InputSignal<ColumnsCollapse>;
|
|
8093
8621
|
readonly align: import("@angular/core").InputSignal<ColumnsAlign>;
|
|
8622
|
+
/** Column count at viewport widths <= 1024px (falls back to `count`). */
|
|
8623
|
+
readonly countBelowLg: import("@angular/core").InputSignal<ColumnsCount | null>;
|
|
8624
|
+
/** Column count at <= 768px (falls back to `countBelowLg`, then `count`). */
|
|
8625
|
+
readonly countBelowMd: import("@angular/core").InputSignal<ColumnsCount | null>;
|
|
8626
|
+
/** Column count at <= 480px (falls back to `countBelowMd`, then `countBelowLg`, then `count`). */
|
|
8627
|
+
readonly countBelowSm: import("@angular/core").InputSignal<ColumnsCount | null>;
|
|
8094
8628
|
protected readonly cols: import("@angular/core").Signal<ColumnsCount>;
|
|
8629
|
+
private static clampTier;
|
|
8630
|
+
protected readonly colsLg: import("@angular/core").Signal<ColumnsCount | null>;
|
|
8631
|
+
protected readonly colsMd: import("@angular/core").Signal<ColumnsCount | null>;
|
|
8632
|
+
protected readonly colsSm: import("@angular/core").Signal<ColumnsCount | null>;
|
|
8095
8633
|
protected readonly gapCss: import("@angular/core").Signal<string>;
|
|
8096
8634
|
protected readonly collapseClass: import("@angular/core").Signal<string>;
|
|
8097
8635
|
static ɵfac: i0.ɵɵFactoryDeclaration<ColumnsComponent, never>;
|
|
@@ -8116,6 +8654,21 @@ export declare class ColumnsComponent {
|
|
|
8116
8654
|
"required": false;
|
|
8117
8655
|
"isSignal": true;
|
|
8118
8656
|
};
|
|
8657
|
+
"countBelowLg": {
|
|
8658
|
+
"alias": "countBelowLg";
|
|
8659
|
+
"required": false;
|
|
8660
|
+
"isSignal": true;
|
|
8661
|
+
};
|
|
8662
|
+
"countBelowMd": {
|
|
8663
|
+
"alias": "countBelowMd";
|
|
8664
|
+
"required": false;
|
|
8665
|
+
"isSignal": true;
|
|
8666
|
+
};
|
|
8667
|
+
"countBelowSm": {
|
|
8668
|
+
"alias": "countBelowSm";
|
|
8669
|
+
"required": false;
|
|
8670
|
+
"isSignal": true;
|
|
8671
|
+
};
|
|
8119
8672
|
}, {}, never, ["*"], true, never>;
|
|
8120
8673
|
}
|
|
8121
8674
|
export type StackDirection = 'vertical' | 'horizontal';
|