@forgeroute/ui 0.4.7 → 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 +1570 -231
- package/fesm2022/forgeroute-ui.mjs.map +1 -1
- package/package.json +1 -1
- package/types/forgeroute-ui.d.ts +531 -18
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 {
|
|
@@ -1812,7 +1815,7 @@ export declare class SidePanelComponent implements OnDestroy {
|
|
|
1812
1815
|
readonly cancelLabel: import("@angular/core").InputSignal<string>;
|
|
1813
1816
|
/** Right-aligned primary action button label. Empty string = hidden. */
|
|
1814
1817
|
readonly primaryLabel: import("@angular/core").InputSignal<string>;
|
|
1815
|
-
readonly primaryVariant: import("@angular/core").InputSignal<"
|
|
1818
|
+
readonly primaryVariant: import("@angular/core").InputSignal<"primary" | "danger" | "warning">;
|
|
1816
1819
|
readonly primaryLoading: import("@angular/core").InputSignal<boolean>;
|
|
1817
1820
|
readonly primaryDisabled: import("@angular/core").InputSignal<boolean>;
|
|
1818
1821
|
/** `data-testid` of the Cancel button; none when empty (default). */
|
|
@@ -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, `''`
|
|
@@ -3343,7 +3423,7 @@ export declare class ButtonComponent {
|
|
|
3343
3423
|
* `ghost-start`: a ghost button for list / section toggles - a full-width row with its content aligned to the start, transparent
|
|
3344
3424
|
* background, hover tint and the normal focus ring. Pair it with `ariaExpanded` / `ariaPressed`; the label may contain a heading element.
|
|
3345
3425
|
*/
|
|
3346
|
-
readonly variant: import("@angular/core").InputSignal<"
|
|
3426
|
+
readonly variant: import("@angular/core").InputSignal<"primary" | "secondary" | "danger" | "warning" | "link" | "ghost" | "ghost-start" | "tab" | "icon" | "icon-danger">;
|
|
3347
3427
|
/** 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`). */
|
|
3348
3428
|
readonly routerLink: import("@angular/core").InputSignal<string | readonly unknown[] | null>;
|
|
3349
3429
|
/** Query params of the `routerLink` (e.g. `{ section: 'deal-defaults' }`). */
|
|
@@ -3746,7 +3826,7 @@ export declare class BulkMessagePanelComponent {
|
|
|
3746
3826
|
readonly sending: import("@angular/core").InputSignal<boolean>;
|
|
3747
3827
|
readonly closed: import("@angular/core").OutputEmitterRef<void>;
|
|
3748
3828
|
readonly send: import("@angular/core").OutputEmitterRef<BulkMessageSendEvent>;
|
|
3749
|
-
readonly channel: import("@angular/core").WritableSignal<"
|
|
3829
|
+
readonly channel: import("@angular/core").WritableSignal<"text" | "email">;
|
|
3750
3830
|
private readonly _subject;
|
|
3751
3831
|
private readonly _body;
|
|
3752
3832
|
get subject(): string;
|
|
@@ -3895,7 +3975,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
|
|
|
3895
3975
|
* Meant for a short mark of 1-3 characters.
|
|
3896
3976
|
*/
|
|
3897
3977
|
readonly prefix: import("@angular/core").InputSignal<string>;
|
|
3898
|
-
readonly type: import("@angular/core").InputSignal<"number" | "
|
|
3978
|
+
readonly type: import("@angular/core").InputSignal<"number" | "text" | "email" | "tel" | "password" | "url">;
|
|
3899
3979
|
readonly maxlength: import("@angular/core").InputSignal<number | undefined>;
|
|
3900
3980
|
readonly required: import("@angular/core").InputSignal<boolean>;
|
|
3901
3981
|
readonly autocomplete: import("@angular/core").InputSignal<string>;
|
|
@@ -3904,7 +3984,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
|
|
|
3904
3984
|
* `search`, `text`, `none`). Empty (default) = the browser's default for the field, except `type="tel"`, which keeps `tel`.
|
|
3905
3985
|
* It only picks the keyboard; it does not restrict what can be typed or pasted.
|
|
3906
3986
|
*/
|
|
3907
|
-
readonly inputmode: import("@angular/core").InputSignal<"" | "
|
|
3987
|
+
readonly inputmode: import("@angular/core").InputSignal<"" | "none" | "text" | "search" | "email" | "tel" | "url" | "decimal" | "numeric">;
|
|
3908
3988
|
readonly readonly: import("@angular/core").InputSignal<boolean>;
|
|
3909
3989
|
readonly hint: import("@angular/core").InputSignal<string>;
|
|
3910
3990
|
readonly error: import("@angular/core").InputSignal<string>;
|
|
@@ -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>;
|
|
@@ -5362,7 +5525,7 @@ export declare class FormRowComponent {
|
|
|
5362
5525
|
* child simply takes the full width. Keep a numeric span within the row's `cols` (use `all` for the whole row).
|
|
5363
5526
|
*/
|
|
5364
5527
|
export declare class FormColSpanDirective {
|
|
5365
|
-
readonly uiColSpan: import("@angular/core").InputSignal<"" | 2 | 3 |
|
|
5528
|
+
readonly uiColSpan: import("@angular/core").InputSignal<"" | "2" | "3" | 2 | 3 | "all">;
|
|
5366
5529
|
protected readonly _class: import("@angular/core").Signal<string>;
|
|
5367
5530
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormColSpanDirective, never>;
|
|
5368
5531
|
static ɵdir: i0.ɵɵDirectiveDeclaration<FormColSpanDirective, "[uiColSpan]", never, {
|
|
@@ -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;
|
|
@@ -6342,6 +6511,12 @@ export declare class AlertComponent {
|
|
|
6342
6511
|
readonly quiet: import("@angular/core").InputSignal<boolean>;
|
|
6343
6512
|
/** Tighter padding and a slightly smaller font, for an alert that is one row of a list. */
|
|
6344
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>;
|
|
6345
6520
|
readonly dismissed: import("@angular/core").OutputEmitterRef<void>;
|
|
6346
6521
|
static ɵfac: i0.ɵɵFactoryDeclaration<AlertComponent, never>;
|
|
6347
6522
|
static ɵcmp: i0.ɵɵComponentDeclaration<AlertComponent, "ui-alert", never, {
|
|
@@ -6370,6 +6545,11 @@ export declare class AlertComponent {
|
|
|
6370
6545
|
"required": false;
|
|
6371
6546
|
"isSignal": true;
|
|
6372
6547
|
};
|
|
6548
|
+
"inline": {
|
|
6549
|
+
"alias": "inline";
|
|
6550
|
+
"required": false;
|
|
6551
|
+
"isSignal": true;
|
|
6552
|
+
};
|
|
6373
6553
|
}, {
|
|
6374
6554
|
"dismissed": "dismissed";
|
|
6375
6555
|
}, never, ["*"], true, never>;
|
|
@@ -6377,7 +6557,7 @@ export declare class AlertComponent {
|
|
|
6377
6557
|
/** The SVG path (24×24 stroke icon) for an icon key, or undefined when the key is unknown. */
|
|
6378
6558
|
export declare function iconPath(name: string): string | undefined;
|
|
6379
6559
|
/** Keys with an icon of their own (the data-table action keys are accepted too — see `builtInActionIcon`). */
|
|
6380
|
-
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';
|
|
6381
6561
|
/**
|
|
6382
6562
|
* A clickable icon. The host passes a key (`name="delete"`) and the library draws that icon; clicking it emits
|
|
6383
6563
|
* `iconClick`, and the host does the actual work (delete the row, open a panel, …).
|
|
@@ -6404,7 +6584,7 @@ export declare class IconComponent {
|
|
|
6404
6584
|
readonly ariaLabel: import("@angular/core").InputSignal<string>;
|
|
6405
6585
|
/** Icon size in px. */
|
|
6406
6586
|
readonly size: import("@angular/core").InputSignal<number>;
|
|
6407
|
-
readonly variant: import("@angular/core").InputSignal<"
|
|
6587
|
+
readonly variant: import("@angular/core").InputSignal<"danger" | "default">;
|
|
6408
6588
|
readonly disabled: import("@angular/core").InputSignal<boolean>;
|
|
6409
6589
|
/** The host is running the request this icon started: a spinner replaces the picture and the button is disabled (no click) until it is false again. */
|
|
6410
6590
|
readonly loading: import("@angular/core").InputSignal<boolean>;
|
|
@@ -6514,7 +6694,7 @@ export declare class TimelineComponent {
|
|
|
6514
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. */
|
|
6515
6695
|
readonly maxHeight: import("@angular/core").InputSignal<string>;
|
|
6516
6696
|
/** `below` (default): the time is under the title / description. `end`: the time sits right-aligned on the title row. */
|
|
6517
|
-
readonly timePosition: import("@angular/core").InputSignal<"
|
|
6697
|
+
readonly timePosition: import("@angular/core").InputSignal<"end" | "below">;
|
|
6518
6698
|
/** Solid dot colour of an item's `dotVariant`, or null (then `tone` colours it). */
|
|
6519
6699
|
dotColor(item: TimelineItem): string | null;
|
|
6520
6700
|
static ɵfac: i0.ɵɵFactoryDeclaration<TimelineComponent, never>;
|
|
@@ -6642,6 +6822,284 @@ export declare class ImagePreviewComponent {
|
|
|
6642
6822
|
};
|
|
6643
6823
|
}, {}, never, never, true, never>;
|
|
6644
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
|
+
}
|
|
6645
7103
|
/**
|
|
6646
7104
|
* Inline field error for controls that have no `error` input of their own — e.g. an app-specific
|
|
6647
7105
|
* picker. Renders exactly like the library inputs' own field error (small red text under the field,
|
|
@@ -7038,6 +7496,8 @@ export declare class RadioComponent {
|
|
|
7038
7496
|
readonly description: import("@angular/core").InputSignal<string>;
|
|
7039
7497
|
/** Accessible name when there is no visible `label`. */
|
|
7040
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>;
|
|
7041
7501
|
readonly value: import("@angular/core").InputSignal<string>;
|
|
7042
7502
|
/** Radios with the same `name` form one keyboard (arrow key) group. */
|
|
7043
7503
|
readonly name: import("@angular/core").InputSignal<string>;
|
|
@@ -7079,6 +7539,11 @@ export declare class RadioComponent {
|
|
|
7079
7539
|
"required": false;
|
|
7080
7540
|
"isSignal": true;
|
|
7081
7541
|
};
|
|
7542
|
+
"testId": {
|
|
7543
|
+
"alias": "testId";
|
|
7544
|
+
"required": false;
|
|
7545
|
+
"isSignal": true;
|
|
7546
|
+
};
|
|
7082
7547
|
"value": {
|
|
7083
7548
|
"alias": "value";
|
|
7084
7549
|
"required": false;
|
|
@@ -7487,7 +7952,7 @@ export declare class PdfHotspotComponent {
|
|
|
7487
7952
|
/** `ready`: clickable; `blocked`: disabled (a prerequisite is missing); `signed`: shows `image`. */
|
|
7488
7953
|
readonly state: import("@angular/core").InputSignal<"ready" | "blocked" | "signed">;
|
|
7489
7954
|
/** `warning` gives the ready state an amber look (e.g. for initials), default is blue. */
|
|
7490
|
-
readonly tone: import("@angular/core").InputSignal<"
|
|
7955
|
+
readonly tone: import("@angular/core").InputSignal<"primary" | "warning">;
|
|
7491
7956
|
/** Text of the ready button (e.g. "Sign Here"). */
|
|
7492
7957
|
readonly label: import("@angular/core").InputSignal<string>;
|
|
7493
7958
|
/** Text of the blocked button (e.g. "Add signature above"). */
|
|
@@ -7580,7 +8045,10 @@ export declare class PdfHotspotComponent {
|
|
|
7580
8045
|
* - `<div card-header-leading>`: something before the title block, such as a logo or an icon.
|
|
7581
8046
|
* - `<ng-container card-header>`: your own header content, shown under the title (or instead of it when no title is set).
|
|
7582
8047
|
* - `<ng-container card-header-action>`: buttons or links on the right side of the header.
|
|
7583
|
-
* - `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.
|
|
7584
8052
|
* - `background`: the card's background colour (any CSS colour; default white).
|
|
7585
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.
|
|
7586
8054
|
* - The body has built-in padding (16px 18px, matching the header's 18px side padding); there is no padding input.
|
|
@@ -7605,7 +8073,7 @@ export declare class DetailCardComponent {
|
|
|
7605
8073
|
/** true (default) = the title is displayed in capitals (CSS only); false = shown as written. The text, aria-label and heading name are never changed. */
|
|
7606
8074
|
readonly uppercaseTitle: import("@angular/core").InputSignal<boolean>;
|
|
7607
8075
|
/** 1-6 makes the title a real heading for screen readers (role=heading, aria-level); null keeps it plain text. */
|
|
7608
|
-
readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 3 | 4 |
|
|
8076
|
+
readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 3 | 4 | 5 | 6 | null>;
|
|
7609
8077
|
/** Optional id for the title text; the card is then labelled by it. Without it the title is the card's aria-label. */
|
|
7610
8078
|
readonly titleId: import("@angular/core").InputSignal<string>;
|
|
7611
8079
|
/** Accessible name of the card when the header gives none (no header, or no title). A visible title wins; blank = no name. */
|
|
@@ -7626,6 +8094,10 @@ export declare class DetailCardComponent {
|
|
|
7626
8094
|
readonly showEdit: import("@angular/core").InputSignal<boolean>;
|
|
7627
8095
|
readonly editLabel: import("@angular/core").InputSignal<string>;
|
|
7628
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>;
|
|
7629
8101
|
/** The group's aria-label: the visible title (unless `titleId` names the card instead), else `ariaLabel`, else none. */
|
|
7630
8102
|
groupLabel(): string | null;
|
|
7631
8103
|
/** The body is open unless the card has a header that is collapsible and was collapsed. */
|
|
@@ -7700,6 +8172,16 @@ export declare class DetailCardComponent {
|
|
|
7700
8172
|
"required": false;
|
|
7701
8173
|
"isSignal": true;
|
|
7702
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
|
+
};
|
|
7703
8185
|
}, {
|
|
7704
8186
|
"expanded": "expandedChange";
|
|
7705
8187
|
"editClick": "editClick";
|
|
@@ -8119,6 +8601,12 @@ export type ColumnsAlign = 'start' | 'center' | 'stretch';
|
|
|
8119
8601
|
* - `collapseAt`: sm (480px) | md (768px) | lg (1024px) | never. Below that viewport width the columns become one.
|
|
8120
8602
|
* Plain media queries are used (not container queries) because they behave the same in every supported browser.
|
|
8121
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"`.
|
|
8122
8610
|
*
|
|
8123
8611
|
* <ui-columns>
|
|
8124
8612
|
* <ui-form-section label="Email"> ... </ui-form-section>
|
|
@@ -8131,7 +8619,17 @@ export declare class ColumnsComponent {
|
|
|
8131
8619
|
readonly gap: import("@angular/core").InputSignal<string>;
|
|
8132
8620
|
readonly collapseAt: import("@angular/core").InputSignal<ColumnsCollapse>;
|
|
8133
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>;
|
|
8134
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>;
|
|
8135
8633
|
protected readonly gapCss: import("@angular/core").Signal<string>;
|
|
8136
8634
|
protected readonly collapseClass: import("@angular/core").Signal<string>;
|
|
8137
8635
|
static ɵfac: i0.ɵɵFactoryDeclaration<ColumnsComponent, never>;
|
|
@@ -8156,6 +8654,21 @@ export declare class ColumnsComponent {
|
|
|
8156
8654
|
"required": false;
|
|
8157
8655
|
"isSignal": true;
|
|
8158
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
|
+
};
|
|
8159
8672
|
}, {}, never, ["*"], true, never>;
|
|
8160
8673
|
}
|
|
8161
8674
|
export type StackDirection = 'vertical' | 'horizontal';
|