@forgeroute/ui 0.4.7 → 0.4.9
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 +22 -4
- package/fesm2022/forgeroute-ui-messaging.mjs.map +1 -1
- package/fesm2022/forgeroute-ui-stripe.mjs +9 -3
- package/fesm2022/forgeroute-ui-stripe.mjs.map +1 -1
- package/fesm2022/forgeroute-ui.mjs +6767 -3903
- package/fesm2022/forgeroute-ui.mjs.map +1 -1
- package/package.json +1 -1
- package/types/forgeroute-ui.d.ts +1026 -31
package/types/forgeroute-ui.d.ts
CHANGED
|
@@ -961,7 +961,7 @@ export declare class SelectComponent implements ControlValueAccessor, Validator,
|
|
|
961
961
|
readonly error: import("@angular/core").InputSignal<string>;
|
|
962
962
|
/** Reveal the built-in error messages now (e.g. after a failed Save click), without waiting for blur. */
|
|
963
963
|
readonly showErrors: import("@angular/core").InputSignal<boolean>;
|
|
964
|
-
readonly size: import("@angular/core").InputSignal<"
|
|
964
|
+
readonly size: import("@angular/core").InputSignal<"sm" | "default">;
|
|
965
965
|
readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
|
|
966
966
|
private readonly _cvaDisabled;
|
|
967
967
|
protected readonly disabled: import("@angular/core").Signal<boolean>;
|
|
@@ -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). */
|
|
@@ -1906,7 +1909,7 @@ export declare class ModalComponent implements OnInit, OnDestroy {
|
|
|
1906
1909
|
readonly title: import("@angular/core").InputSignal<string>;
|
|
1907
1910
|
readonly description: import("@angular/core").InputSignal<string>;
|
|
1908
1911
|
readonly maxWidth: import("@angular/core").InputSignal<string>;
|
|
1909
|
-
readonly bodyOverflow: import("@angular/core").InputSignal<"
|
|
1912
|
+
readonly bodyOverflow: import("@angular/core").InputSignal<"auto" | "hidden" | "visible">;
|
|
1910
1913
|
/** `data-testid` of the dialog element itself (the host `<ui-modal>` is always in the page, the dialog only while open). None when empty. */
|
|
1911
1914
|
readonly dialogTestId: import("@angular/core").InputSignal<string>;
|
|
1912
1915
|
/** Hides the header X button (e.g. while a request is running). Escape and a backdrop click still close unless `closable` is false. */
|
|
@@ -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;
|
|
@@ -2465,11 +2495,23 @@ export interface CheckboxOption {
|
|
|
2465
2495
|
disabled?: boolean;
|
|
2466
2496
|
/** `data-testid` of this option's native checkbox (e.g. for end-to-end tests); none when omitted. */
|
|
2467
2497
|
testId?: string;
|
|
2498
|
+
/** `data-testid` of this option's label text; none when omitted. */
|
|
2499
|
+
labelTestId?: string;
|
|
2468
2500
|
}
|
|
2469
2501
|
export declare class CheckboxComponent implements ControlValueAccessor, Validator, UiFieldValidity {
|
|
2470
2502
|
readonly label: import("@angular/core").InputSignal<string>;
|
|
2471
2503
|
/** Accessible name for the native checkbox when there is no visible `label` (e.g. a table row's selector). */
|
|
2472
2504
|
readonly ariaLabel: import("@angular/core").InputSignal<string>;
|
|
2505
|
+
/** `data-testid` of the native checkbox (single mode), for end-to-end tests; none when empty. (Group options have their own `testId`.) */
|
|
2506
|
+
readonly testId: import("@angular/core").InputSignal<string>;
|
|
2507
|
+
/** `data-testid` of the label text (single mode), e.g. to find a product name that is also its checkbox label; none when empty. */
|
|
2508
|
+
readonly labelTestId: import("@angular/core").InputSignal<string>;
|
|
2509
|
+
/**
|
|
2510
|
+
* 1-6 makes the label text a real heading for screen readers (`role="heading"` + `aria-level`) while it stays the checkbox's label and
|
|
2511
|
+
* 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.
|
|
2512
|
+
* Default null: plain label text, exactly as before. Single mode only.
|
|
2513
|
+
*/
|
|
2514
|
+
readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 3 | 4 | 5 | 6 | null>;
|
|
2473
2515
|
readonly indeterminate: import("@angular/core").InputSignal<boolean>;
|
|
2474
2516
|
readonly checked: import("@angular/core").ModelSignal<boolean>;
|
|
2475
2517
|
/**
|
|
@@ -2567,6 +2609,21 @@ export declare class CheckboxComponent implements ControlValueAccessor, Validato
|
|
|
2567
2609
|
"required": false;
|
|
2568
2610
|
"isSignal": true;
|
|
2569
2611
|
};
|
|
2612
|
+
"testId": {
|
|
2613
|
+
"alias": "testId";
|
|
2614
|
+
"required": false;
|
|
2615
|
+
"isSignal": true;
|
|
2616
|
+
};
|
|
2617
|
+
"labelTestId": {
|
|
2618
|
+
"alias": "labelTestId";
|
|
2619
|
+
"required": false;
|
|
2620
|
+
"isSignal": true;
|
|
2621
|
+
};
|
|
2622
|
+
"headingLevel": {
|
|
2623
|
+
"alias": "headingLevel";
|
|
2624
|
+
"required": false;
|
|
2625
|
+
"isSignal": true;
|
|
2626
|
+
};
|
|
2570
2627
|
"indeterminate": {
|
|
2571
2628
|
"alias": "indeterminate";
|
|
2572
2629
|
"required": false;
|
|
@@ -2737,6 +2794,19 @@ export interface StepperStep {
|
|
|
2737
2794
|
disabled?: boolean;
|
|
2738
2795
|
/** `true` or a message marks the step as failed ("!" indicator, red). A message string is shown under the label and announced. */
|
|
2739
2796
|
error?: boolean | string;
|
|
2797
|
+
/**
|
|
2798
|
+
* Overrides the state derived from the step's position. `true` = complete (check mark, selectable with `linear`) even
|
|
2799
|
+
* when the step comes after `current`; `false` = upcoming even when it comes before `current`. Omit to derive it from
|
|
2800
|
+
* the order. The current step always stays current. Use it when the user can jump back and keep the progress made:
|
|
2801
|
+
* mark every step the user has already completed `complete: true`.
|
|
2802
|
+
*/
|
|
2803
|
+
complete?: boolean;
|
|
2804
|
+
/**
|
|
2805
|
+
* `false` = never a button, even when the step is complete and the stepper is `clickable`: it is plain text and keeps its normal look
|
|
2806
|
+
* (no dimming, not announced "disabled"). Use it for a step the user has finished but may not jump back or forward to. Omitted / `true`
|
|
2807
|
+
* = the normal rule (a complete step is a button when `clickable`). It cannot make an upcoming step selectable; use `linear`.
|
|
2808
|
+
*/
|
|
2809
|
+
selectable?: boolean;
|
|
2740
2810
|
}
|
|
2741
2811
|
export type StepperOrientation = 'horizontal' | 'vertical';
|
|
2742
2812
|
/**
|
|
@@ -2756,19 +2826,31 @@ export type StepperOrientation = 'horizontal' | 'vertical';
|
|
|
2756
2826
|
* steps = [{ key: 'info', label: 'Info' }, { key: 'pay', label: 'Payment', error: 'Card was declined' }, ...]
|
|
2757
2827
|
*
|
|
2758
2828
|
* `current` is two-way (`[(current)]`). An empty or unknown key means there is no current step: every step is upcoming
|
|
2759
|
-
*
|
|
2829
|
+
* unless it sets `complete: true`. `error` changes the indicator, not the state or `aria-current`.
|
|
2830
|
+
*
|
|
2831
|
+
* Per-step state: a step's `complete` flag overrides the position-derived state (see `StepperStep.complete`), so a wizard
|
|
2832
|
+
* that lets the user go back can keep the steps already done marked complete:
|
|
2833
|
+
*
|
|
2834
|
+
* steps = all.map((s, i) => ({ ...s, complete: i <= furthestReached }))
|
|
2835
|
+
*
|
|
2836
|
+
* A step with `selectable: false` is never a button (finished, but not a place to go back to) and looks normal; `disabled` is for a step
|
|
2837
|
+
* that is switched off (dimmed, announced "disabled").
|
|
2760
2838
|
*
|
|
2761
2839
|
* 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
|
|
2840
|
+
* `linear` (default) only complete steps are selectable, so the user can go back but not skip ahead; with
|
|
2841
|
+
* `[linear]="false"` every non-disabled step is. The current step is never a button (you are already there): it is
|
|
2842
|
+
* plain text with `aria-current="step"`. Activating a selectable step sets `current` (so `[(current)]` follows) and
|
|
2843
|
+
* emits `stepClick` with its key; an unselectable step does nothing. Without `clickable` there are no buttons or tab
|
|
2844
|
+
* stops at all.
|
|
2766
2845
|
*
|
|
2767
2846
|
* Accessibility: an ordered list named by `ariaLabel`; the current step has `aria-current="step"`. Each step's name is
|
|
2768
2847
|
* "<label>, step N of M, completed | current step | not started" (+ ", optional", ", error: <message>", ", disabled"),
|
|
2769
2848
|
* built from visually hidden text so it is announced in the list even when the step is not a button. Indicators and
|
|
2770
2849
|
* connectors are decorative. A description is referenced with `aria-describedby`.
|
|
2771
2850
|
*
|
|
2851
|
+
* Theming: `accentColor` / `completeColor` (any CSS colour) recolour the current step, the complete steps and the filled
|
|
2852
|
+
* connectors; leave them out for the library blue. Or set `--ui-accent` (and `--ui-accent-soft`) once in the app.
|
|
2853
|
+
*
|
|
2772
2854
|
* Layout: `orientation` horizontal (row with connector lines that fill as steps complete) or vertical (column, connector
|
|
2773
2855
|
* on the left). Long labels wrap. At <= 480px a horizontal stepper with `labelsOnSmallScreens="current"` (default) shows
|
|
2774
2856
|
* only the current step's label (the others stay in the accessible name); `"all"` keeps them. Touch devices and phones
|
|
@@ -2785,6 +2867,12 @@ export declare class StepperComponent {
|
|
|
2785
2867
|
/** With `clickable`: `true` (default) = only complete steps and the current step are selectable; `false` = any enabled step. */
|
|
2786
2868
|
readonly linear: import("@angular/core").InputSignal<boolean>;
|
|
2787
2869
|
readonly size: import("@angular/core").InputSignal<"sm" | "md">;
|
|
2870
|
+
/** 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`). */
|
|
2871
|
+
readonly accentColor: import("@angular/core").InputSignal<string>;
|
|
2872
|
+
/** 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). */
|
|
2873
|
+
readonly completeColor: import("@angular/core").InputSignal<string>;
|
|
2874
|
+
/** true = the current step's label is drawn in the accent colour as well as its indicator. Default false: the label keeps the dark text colour. */
|
|
2875
|
+
readonly accentLabels: import("@angular/core").InputSignal<boolean>;
|
|
2788
2876
|
/** Accessible name of the list. */
|
|
2789
2877
|
readonly ariaLabel: import("@angular/core").InputSignal<string>;
|
|
2790
2878
|
/** Horizontal, <= 480px: show only the current step's label (`'current'`, default) or every label (`'all'`). */
|
|
@@ -2840,6 +2928,21 @@ export declare class StepperComponent {
|
|
|
2840
2928
|
"required": false;
|
|
2841
2929
|
"isSignal": true;
|
|
2842
2930
|
};
|
|
2931
|
+
"accentColor": {
|
|
2932
|
+
"alias": "accentColor";
|
|
2933
|
+
"required": false;
|
|
2934
|
+
"isSignal": true;
|
|
2935
|
+
};
|
|
2936
|
+
"completeColor": {
|
|
2937
|
+
"alias": "completeColor";
|
|
2938
|
+
"required": false;
|
|
2939
|
+
"isSignal": true;
|
|
2940
|
+
};
|
|
2941
|
+
"accentLabels": {
|
|
2942
|
+
"alias": "accentLabels";
|
|
2943
|
+
"required": false;
|
|
2944
|
+
"isSignal": true;
|
|
2945
|
+
};
|
|
2843
2946
|
"ariaLabel": {
|
|
2844
2947
|
"alias": "ariaLabel";
|
|
2845
2948
|
"required": false;
|
|
@@ -3033,6 +3136,8 @@ export interface RadioOption {
|
|
|
3033
3136
|
label: string;
|
|
3034
3137
|
description?: string;
|
|
3035
3138
|
disabled?: boolean;
|
|
3139
|
+
/** `data-testid` of this option's native radio input (e.g. for end-to-end tests); none when omitted. */
|
|
3140
|
+
testId?: string;
|
|
3036
3141
|
}
|
|
3037
3142
|
/**
|
|
3038
3143
|
* Group of native radio buttons inside a `<fieldset>` (+ `<legend>` = `label`), a ControlValueAccessor (string value, `''`
|
|
@@ -3343,7 +3448,7 @@ export declare class ButtonComponent {
|
|
|
3343
3448
|
* `ghost-start`: a ghost button for list / section toggles - a full-width row with its content aligned to the start, transparent
|
|
3344
3449
|
* background, hover tint and the normal focus ring. Pair it with `ariaExpanded` / `ariaPressed`; the label may contain a heading element.
|
|
3345
3450
|
*/
|
|
3346
|
-
readonly variant: import("@angular/core").InputSignal<"
|
|
3451
|
+
readonly variant: import("@angular/core").InputSignal<"primary" | "secondary" | "ghost" | "ghost-start" | "danger" | "link" | "warning" | "tab" | "icon" | "icon-danger">;
|
|
3347
3452
|
/** 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
3453
|
readonly routerLink: import("@angular/core").InputSignal<string | readonly unknown[] | null>;
|
|
3349
3454
|
/** Query params of the `routerLink` (e.g. `{ section: 'deal-defaults' }`). */
|
|
@@ -3358,7 +3463,7 @@ export declare class ButtonComponent {
|
|
|
3358
3463
|
*/
|
|
3359
3464
|
readonly href: import("@angular/core").InputSignal<string | null>;
|
|
3360
3465
|
/** Where to open the `href` (`_blank` = a new tab). */
|
|
3361
|
-
readonly target: import("@angular/core").InputSignal<"
|
|
3466
|
+
readonly target: import("@angular/core").InputSignal<"_blank" | "_self" | "_parent" | "_top" | null>;
|
|
3362
3467
|
/** `rel` of the `href` link. A `_blank` target always gets `noopener noreferrer` added. */
|
|
3363
3468
|
readonly rel: import("@angular/core").InputSignal<string | null>;
|
|
3364
3469
|
/** The href when it is allowed (http, https, mailto, tel, sms or a relative URL), else null. */
|
|
@@ -3366,8 +3471,8 @@ export declare class ButtonComponent {
|
|
|
3366
3471
|
protected readonly _rel: import("@angular/core").Signal<string | null>;
|
|
3367
3472
|
readonly color: import("@angular/core").InputSignal<string | undefined>;
|
|
3368
3473
|
readonly active: import("@angular/core").InputSignal<boolean>;
|
|
3369
|
-
readonly size: import("@angular/core").InputSignal<"
|
|
3370
|
-
readonly type: import("@angular/core").InputSignal<"
|
|
3474
|
+
readonly size: import("@angular/core").InputSignal<"xs" | "sm" | "md" | "lg">;
|
|
3475
|
+
readonly type: import("@angular/core").InputSignal<"button" | "submit" | "reset">;
|
|
3371
3476
|
readonly disabled: import("@angular/core").InputSignal<boolean>;
|
|
3372
3477
|
readonly loading: import("@angular/core").InputSignal<boolean>;
|
|
3373
3478
|
readonly fullWidth: import("@angular/core").InputSignal<boolean>;
|
|
@@ -3746,7 +3851,7 @@ export declare class BulkMessagePanelComponent {
|
|
|
3746
3851
|
readonly sending: import("@angular/core").InputSignal<boolean>;
|
|
3747
3852
|
readonly closed: import("@angular/core").OutputEmitterRef<void>;
|
|
3748
3853
|
readonly send: import("@angular/core").OutputEmitterRef<BulkMessageSendEvent>;
|
|
3749
|
-
readonly channel: import("@angular/core").WritableSignal<"
|
|
3854
|
+
readonly channel: import("@angular/core").WritableSignal<"text" | "email">;
|
|
3750
3855
|
private readonly _subject;
|
|
3751
3856
|
private readonly _body;
|
|
3752
3857
|
get subject(): string;
|
|
@@ -3895,7 +4000,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
|
|
|
3895
4000
|
* Meant for a short mark of 1-3 characters.
|
|
3896
4001
|
*/
|
|
3897
4002
|
readonly prefix: import("@angular/core").InputSignal<string>;
|
|
3898
|
-
readonly type: import("@angular/core").InputSignal<"number" | "
|
|
4003
|
+
readonly type: import("@angular/core").InputSignal<"number" | "text" | "tel" | "email" | "password" | "url">;
|
|
3899
4004
|
readonly maxlength: import("@angular/core").InputSignal<number | undefined>;
|
|
3900
4005
|
readonly required: import("@angular/core").InputSignal<boolean>;
|
|
3901
4006
|
readonly autocomplete: import("@angular/core").InputSignal<string>;
|
|
@@ -3904,7 +4009,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
|
|
|
3904
4009
|
* `search`, `text`, `none`). Empty (default) = the browser's default for the field, except `type="tel"`, which keeps `tel`.
|
|
3905
4010
|
* It only picks the keyboard; it does not restrict what can be typed or pasted.
|
|
3906
4011
|
*/
|
|
3907
|
-
readonly inputmode: import("@angular/core").InputSignal<"" | "
|
|
4012
|
+
readonly inputmode: import("@angular/core").InputSignal<"" | "none" | "text" | "tel" | "search" | "email" | "url" | "decimal" | "numeric">;
|
|
3908
4013
|
readonly readonly: import("@angular/core").InputSignal<boolean>;
|
|
3909
4014
|
readonly hint: import("@angular/core").InputSignal<string>;
|
|
3910
4015
|
readonly error: import("@angular/core").InputSignal<string>;
|
|
@@ -3936,6 +4041,8 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
|
|
|
3936
4041
|
readonly formatter: import("@angular/core").InputSignal<((raw: string) => string) | undefined>;
|
|
3937
4042
|
/** Reveal the built-in error messages now (e.g. after a failed Save click), without waiting for blur. */
|
|
3938
4043
|
readonly showErrors: import("@angular/core").InputSignal<boolean>;
|
|
4044
|
+
/** 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. */
|
|
4045
|
+
readonly valueChange: import("@angular/core").OutputEmitterRef<string | number | null>;
|
|
3939
4046
|
readonly focused: import("@angular/core").OutputEmitterRef<void>;
|
|
3940
4047
|
readonly blurred: import("@angular/core").OutputEmitterRef<void>;
|
|
3941
4048
|
/** Emits whenever the field becomes invalid / valid. */
|
|
@@ -4096,6 +4203,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
|
|
|
4096
4203
|
"isSignal": true;
|
|
4097
4204
|
};
|
|
4098
4205
|
}, {
|
|
4206
|
+
"valueChange": "valueChange";
|
|
4099
4207
|
"focused": "focused";
|
|
4100
4208
|
"blurred": "blurred";
|
|
4101
4209
|
"invalidChange": "invalidChange";
|
|
@@ -4230,7 +4338,8 @@ export declare class TextareaInputComponent implements ControlValueAccessor, Val
|
|
|
4230
4338
|
}, never, never, true, never>;
|
|
4231
4339
|
}
|
|
4232
4340
|
export type TextSize = 'sm' | 'md' | 'lg';
|
|
4233
|
-
export type TextTone = 'default' | 'muted';
|
|
4341
|
+
export type TextTone = 'default' | 'muted' | 'accent';
|
|
4342
|
+
export type TextWeight = 'normal' | 'medium' | 'semibold' | 'bold';
|
|
4234
4343
|
/**
|
|
4235
4344
|
* 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
4345
|
* no tab stop, no resize handle, selectable and copyable, and read normally by screen readers (including browse mode).
|
|
@@ -4242,13 +4351,32 @@ export type TextTone = 'default' | 'muted';
|
|
|
4242
4351
|
* stretching the layout. The text is never interpreted as HTML. Pass the text through `[text]` (not as projected content),
|
|
4243
4352
|
* so the template's own indentation can never leak into it. An empty or missing text renders nothing.
|
|
4244
4353
|
*
|
|
4245
|
-
*
|
|
4354
|
+
* Inline emphasis without HTML: `strong` (a string or a list of strings) makes every occurrence of those exact snippets bold
|
|
4355
|
+
* (case-sensitive, longest first, never overlapping), e.g. `<ui-text text="Delivered to 12 Oak St, Peoria" strong="12 Oak St, Peoria" />`.
|
|
4356
|
+
* The text is still never parsed as HTML; `textContent` is unchanged (the snippets are wrapped in `<strong>`). Without `strong` the
|
|
4357
|
+
* markup is exactly what it always was.
|
|
4358
|
+
*
|
|
4359
|
+
* Inputs: `text`, `size` (sm 0.8125rem | md 0.875rem | lg 1rem, default md), `tone` (default slate | muted grey),
|
|
4360
|
+
* `weight` (normal | medium 500 | semibold 600 | bold 700, default normal - no font-weight is set, so the text is exactly as before;
|
|
4361
|
+
* use bold for a total such as "Balance Due").
|
|
4246
4362
|
*/
|
|
4247
4363
|
export declare class TextComponent {
|
|
4248
4364
|
/** The text to show. Line breaks are kept; it is never parsed as HTML. */
|
|
4249
4365
|
readonly text: import("@angular/core").InputSignal<string | null | undefined>;
|
|
4250
4366
|
readonly size: import("@angular/core").InputSignal<TextSize>;
|
|
4251
4367
|
readonly tone: import("@angular/core").InputSignal<TextTone>;
|
|
4368
|
+
/** Any CSS colour for the text (e.g. the brand colour). Wins over `tone`; empty = the tone's colour. `tone="accent"` uses `--ui-accent` (default blue). */
|
|
4369
|
+
readonly color: import("@angular/core").InputSignal<string>;
|
|
4370
|
+
/** Snippet(s) of `text` to show in bold. Empty / not found = no change. */
|
|
4371
|
+
readonly strong: import("@angular/core").InputSignal<string | string[] | null | undefined>;
|
|
4372
|
+
/** The text cut into plain and bold pieces; empty when nothing is to be bold (then the text renders as a single text node). */
|
|
4373
|
+
protected readonly segments: import("@angular/core").Signal<{
|
|
4374
|
+
text: string;
|
|
4375
|
+
strong: boolean;
|
|
4376
|
+
}[]>;
|
|
4377
|
+
/** normal (default) | medium | semibold | bold. Normal sets nothing, so existing text is unchanged. */
|
|
4378
|
+
readonly weight: import("@angular/core").InputSignal<TextWeight>;
|
|
4379
|
+
protected readonly fontWeight: import("@angular/core").Signal<string | null>;
|
|
4252
4380
|
protected readonly fontSize: import("@angular/core").Signal<string>;
|
|
4253
4381
|
static ɵfac: i0.ɵɵFactoryDeclaration<TextComponent, never>;
|
|
4254
4382
|
static ɵcmp: i0.ɵɵComponentDeclaration<TextComponent, "ui-text", never, {
|
|
@@ -4267,6 +4395,21 @@ export declare class TextComponent {
|
|
|
4267
4395
|
"required": false;
|
|
4268
4396
|
"isSignal": true;
|
|
4269
4397
|
};
|
|
4398
|
+
"color": {
|
|
4399
|
+
"alias": "color";
|
|
4400
|
+
"required": false;
|
|
4401
|
+
"isSignal": true;
|
|
4402
|
+
};
|
|
4403
|
+
"strong": {
|
|
4404
|
+
"alias": "strong";
|
|
4405
|
+
"required": false;
|
|
4406
|
+
"isSignal": true;
|
|
4407
|
+
};
|
|
4408
|
+
"weight": {
|
|
4409
|
+
"alias": "weight";
|
|
4410
|
+
"required": false;
|
|
4411
|
+
"isSignal": true;
|
|
4412
|
+
};
|
|
4270
4413
|
}, {}, never, never, true, never>;
|
|
4271
4414
|
}
|
|
4272
4415
|
/** Why a chosen file was refused. */
|
|
@@ -4584,6 +4727,8 @@ export declare class DateInputComponent implements ControlValueAccessor, Validat
|
|
|
4584
4727
|
readonly errorMessage: import("@angular/core").Signal<string>;
|
|
4585
4728
|
/** Emits whenever the field becomes invalid / valid. */
|
|
4586
4729
|
readonly invalidChange: import("@angular/core").OutputEmitterRef<boolean>;
|
|
4730
|
+
/** 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. */
|
|
4731
|
+
readonly valueChange: import("@angular/core").OutputEmitterRef<string>;
|
|
4587
4732
|
protected readonly _activeError: import("@angular/core").Signal<string>;
|
|
4588
4733
|
private _onValidatorChange;
|
|
4589
4734
|
constructor();
|
|
@@ -4645,6 +4790,7 @@ export declare class DateInputComponent implements ControlValueAccessor, Validat
|
|
|
4645
4790
|
};
|
|
4646
4791
|
}, {
|
|
4647
4792
|
"invalidChange": "invalidChange";
|
|
4793
|
+
"valueChange": "valueChange";
|
|
4648
4794
|
}, never, never, true, never>;
|
|
4649
4795
|
}
|
|
4650
4796
|
export declare class DatetimeInputComponent implements ControlValueAccessor, Validator, UiFieldValidity {
|
|
@@ -5231,7 +5377,7 @@ export declare class DropdownComponent {
|
|
|
5231
5377
|
readonly loader: import("@angular/core").InputSignal<(() => Promise<DropdownItem[]>) | null>;
|
|
5232
5378
|
readonly active: import("@angular/core").InputSignal<boolean>;
|
|
5233
5379
|
readonly activeValue: import("@angular/core").InputSignal<string>;
|
|
5234
|
-
readonly variant: import("@angular/core").InputSignal<"
|
|
5380
|
+
readonly variant: import("@angular/core").InputSignal<"button" | "badge">;
|
|
5235
5381
|
readonly menuWidth: import("@angular/core").InputSignal<string>;
|
|
5236
5382
|
/**
|
|
5237
5383
|
* Accessible name. Set it when the trigger has no meaningful visible text. Applied as `aria-label` on the
|
|
@@ -5327,6 +5473,55 @@ export declare class DropdownComponent {
|
|
|
5327
5473
|
"itemClick": "itemClick";
|
|
5328
5474
|
}, never, never, true, never>;
|
|
5329
5475
|
}
|
|
5476
|
+
/**
|
|
5477
|
+
* A real `<form>` for a group of library fields, so the browser (and assistive tech) treats it as one: it is announced as a
|
|
5478
|
+
* "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
|
|
5479
|
+
* a native `<form>`; they use this.
|
|
5480
|
+
*
|
|
5481
|
+
* <ui-form ariaLabel="Informant contact details" (submitted)="save()">
|
|
5482
|
+
* <ui-text-input label="Name" [(ngModel)]="name" />
|
|
5483
|
+
* <ui-button type="submit">Save</ui-button>
|
|
5484
|
+
* </ui-form>
|
|
5485
|
+
*
|
|
5486
|
+
* Works with Reactive Forms: `<ui-form [formGroup]="form" ariaLabel="..." (ngSubmit)="save()">` (the `submit` event of the inner
|
|
5487
|
+
* form bubbles to the host, which is what `FormGroupDirective` listens to; it also stops the page from reloading).
|
|
5488
|
+
*
|
|
5489
|
+
* - `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.
|
|
5490
|
+
* - The browser's own validation bubbles are off (`novalidate`): library inputs show their own messages.
|
|
5491
|
+
* - `submitted` emits the submit event after the default action (a page reload) was prevented.
|
|
5492
|
+
* - 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.
|
|
5493
|
+
*/
|
|
5494
|
+
export declare class FormComponent {
|
|
5495
|
+
/** The form's accessible name. Empty = unnamed (no landmark). */
|
|
5496
|
+
readonly ariaLabel: import("@angular/core").InputSignal<string>;
|
|
5497
|
+
/** Id of an element that names the form (wins over `ariaLabel`). */
|
|
5498
|
+
readonly ariaLabelledby: import("@angular/core").InputSignal<string>;
|
|
5499
|
+
/** Browser autofill for the whole form: 'on' | 'off'. Empty = the browser default. */
|
|
5500
|
+
readonly autocomplete: import("@angular/core").InputSignal<"" | "off" | "on">;
|
|
5501
|
+
/** Emits the submit event (Enter in a field, or a submit button). The page is never reloaded. */
|
|
5502
|
+
readonly submitted: import("@angular/core").OutputEmitterRef<Event>;
|
|
5503
|
+
protected onSubmit(event: Event): void;
|
|
5504
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<FormComponent, never>;
|
|
5505
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FormComponent, "ui-form", never, {
|
|
5506
|
+
"ariaLabel": {
|
|
5507
|
+
"alias": "ariaLabel";
|
|
5508
|
+
"required": false;
|
|
5509
|
+
"isSignal": true;
|
|
5510
|
+
};
|
|
5511
|
+
"ariaLabelledby": {
|
|
5512
|
+
"alias": "ariaLabelledby";
|
|
5513
|
+
"required": false;
|
|
5514
|
+
"isSignal": true;
|
|
5515
|
+
};
|
|
5516
|
+
"autocomplete": {
|
|
5517
|
+
"alias": "autocomplete";
|
|
5518
|
+
"required": false;
|
|
5519
|
+
"isSignal": true;
|
|
5520
|
+
};
|
|
5521
|
+
}, {
|
|
5522
|
+
"submitted": "submitted";
|
|
5523
|
+
}, never, ["*"], true, never>;
|
|
5524
|
+
}
|
|
5330
5525
|
export declare class FormSectionComponent {
|
|
5331
5526
|
readonly label: import("@angular/core").InputSignal<string>;
|
|
5332
5527
|
readonly divider: import("@angular/core").InputSignal<boolean>;
|
|
@@ -5362,7 +5557,7 @@ export declare class FormRowComponent {
|
|
|
5362
5557
|
* child simply takes the full width. Keep a numeric span within the row's `cols` (use `all` for the whole row).
|
|
5363
5558
|
*/
|
|
5364
5559
|
export declare class FormColSpanDirective {
|
|
5365
|
-
readonly uiColSpan: import("@angular/core").InputSignal<"" | 2 | 3 | "
|
|
5560
|
+
readonly uiColSpan: import("@angular/core").InputSignal<"" | 2 | 3 | "all" | "2" | "3">;
|
|
5366
5561
|
protected readonly _class: import("@angular/core").Signal<string>;
|
|
5367
5562
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormColSpanDirective, never>;
|
|
5368
5563
|
static ɵdir: i0.ɵɵDirectiveDeclaration<FormColSpanDirective, "[uiColSpan]", never, {
|
|
@@ -5521,12 +5716,14 @@ export declare class ListItemComponent {
|
|
|
5521
5716
|
*
|
|
5522
5717
|
* providers: [provideForgerouteToast()]
|
|
5523
5718
|
* providers: [provideForgerouteToast({ dismissible: true })] // every toast also gets a close button (default: none)
|
|
5719
|
+
* providers: [provideForgerouteToast({ persistentLiveRegion: true })] // always-present live regions: reliable announcements in VoiceOver / Safari
|
|
5524
5720
|
*
|
|
5525
5721
|
* 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
5722
|
* message renders and is announced once. Nothing happens on the server. The outlet is destroyed with the app.
|
|
5527
5723
|
*/
|
|
5528
5724
|
export declare function provideForgerouteToast(options?: {
|
|
5529
5725
|
dismissible?: boolean;
|
|
5726
|
+
persistentLiveRegion?: boolean;
|
|
5530
5727
|
}): EnvironmentProviders;
|
|
5531
5728
|
/** Payload of `(reorder)`. Apply it with `reorderItems(items, order)` or take the ready-made `items`. */
|
|
5532
5729
|
export interface ListReorderEvent<T = unknown> {
|
|
@@ -5941,6 +6138,10 @@ export interface PanelInfoItem {
|
|
|
5941
6138
|
muted?: boolean;
|
|
5942
6139
|
danger?: boolean;
|
|
5943
6140
|
hidden?: boolean;
|
|
6141
|
+
/** Keep the line breaks of `value` (an address, a note); long lines still wrap. Plain values only. */
|
|
6142
|
+
multiline?: boolean;
|
|
6143
|
+
/** Bold row: the label and the value in the strong text colour and weight (a total, a balance due). */
|
|
6144
|
+
emphasis?: boolean;
|
|
5944
6145
|
}
|
|
5945
6146
|
export interface PanelInfoSection {
|
|
5946
6147
|
title?: string;
|
|
@@ -6091,12 +6292,12 @@ export declare class ChipGroupComponent {
|
|
|
6091
6292
|
/** Space between each chip. */
|
|
6092
6293
|
readonly gap: import("@angular/core").InputSignal<"sm" | "md" | "lg">;
|
|
6093
6294
|
/** Space above the chip group. */
|
|
6094
|
-
readonly spaceAbove: import("@angular/core").InputSignal<"
|
|
6295
|
+
readonly spaceAbove: import("@angular/core").InputSignal<"sm" | "md" | "none">;
|
|
6095
6296
|
/** Space below the chip group. */
|
|
6096
|
-
readonly spaceBelow: import("@angular/core").InputSignal<"
|
|
6097
|
-
protected readonly _gap: import("@angular/core").Signal<"
|
|
6098
|
-
protected readonly _spaceAbove: import("@angular/core").Signal<"0" | "
|
|
6099
|
-
protected readonly _spaceBelow: import("@angular/core").Signal<"0" | "
|
|
6297
|
+
readonly spaceBelow: import("@angular/core").InputSignal<"sm" | "md" | "none">;
|
|
6298
|
+
protected readonly _gap: import("@angular/core").Signal<"12px" | "6px" | "8px">;
|
|
6299
|
+
protected readonly _spaceAbove: import("@angular/core").Signal<"0" | "12px" | "6px">;
|
|
6300
|
+
protected readonly _spaceBelow: import("@angular/core").Signal<"0" | "12px" | "6px">;
|
|
6100
6301
|
static ɵfac: i0.ɵɵFactoryDeclaration<ChipGroupComponent, never>;
|
|
6101
6302
|
static ɵcmp: i0.ɵɵComponentDeclaration<ChipGroupComponent, "ui-chip-group", never, {
|
|
6102
6303
|
"gap": {
|
|
@@ -6342,6 +6543,12 @@ export declare class AlertComponent {
|
|
|
6342
6543
|
readonly quiet: import("@angular/core").InputSignal<boolean>;
|
|
6343
6544
|
/** Tighter padding and a slightly smaller font, for an alert that is one row of a list. */
|
|
6344
6545
|
readonly compact: import("@angular/core").InputSignal<boolean>;
|
|
6546
|
+
/**
|
|
6547
|
+
* Inline body: the projected content flows as ONE line of text (wrapping normally) instead of a row of separate items, so inline
|
|
6548
|
+
* 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>`.
|
|
6549
|
+
* Default false: the body is a flex row with a gap, exactly as before (use it for text plus a button).
|
|
6550
|
+
*/
|
|
6551
|
+
readonly inline: import("@angular/core").InputSignal<boolean>;
|
|
6345
6552
|
readonly dismissed: import("@angular/core").OutputEmitterRef<void>;
|
|
6346
6553
|
static ɵfac: i0.ɵɵFactoryDeclaration<AlertComponent, never>;
|
|
6347
6554
|
static ɵcmp: i0.ɵɵComponentDeclaration<AlertComponent, "ui-alert", never, {
|
|
@@ -6370,6 +6577,11 @@ export declare class AlertComponent {
|
|
|
6370
6577
|
"required": false;
|
|
6371
6578
|
"isSignal": true;
|
|
6372
6579
|
};
|
|
6580
|
+
"inline": {
|
|
6581
|
+
"alias": "inline";
|
|
6582
|
+
"required": false;
|
|
6583
|
+
"isSignal": true;
|
|
6584
|
+
};
|
|
6373
6585
|
}, {
|
|
6374
6586
|
"dismissed": "dismissed";
|
|
6375
6587
|
}, never, ["*"], true, never>;
|
|
@@ -6377,7 +6589,7 @@ export declare class AlertComponent {
|
|
|
6377
6589
|
/** The SVG path (24×24 stroke icon) for an icon key, or undefined when the key is unknown. */
|
|
6378
6590
|
export declare function iconPath(name: string): string | undefined;
|
|
6379
6591
|
/** 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';
|
|
6592
|
+
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
6593
|
/**
|
|
6382
6594
|
* A clickable icon. The host passes a key (`name="delete"`) and the library draws that icon; clicking it emits
|
|
6383
6595
|
* `iconClick`, and the host does the actual work (delete the row, open a panel, …).
|
|
@@ -6404,7 +6616,7 @@ export declare class IconComponent {
|
|
|
6404
6616
|
readonly ariaLabel: import("@angular/core").InputSignal<string>;
|
|
6405
6617
|
/** Icon size in px. */
|
|
6406
6618
|
readonly size: import("@angular/core").InputSignal<number>;
|
|
6407
|
-
readonly variant: import("@angular/core").InputSignal<"
|
|
6619
|
+
readonly variant: import("@angular/core").InputSignal<"danger" | "default">;
|
|
6408
6620
|
readonly disabled: import("@angular/core").InputSignal<boolean>;
|
|
6409
6621
|
/** 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
6622
|
readonly loading: import("@angular/core").InputSignal<boolean>;
|
|
@@ -6514,7 +6726,7 @@ export declare class TimelineComponent {
|
|
|
6514
6726
|
/** 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
6727
|
readonly maxHeight: import("@angular/core").InputSignal<string>;
|
|
6516
6728
|
/** `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<"
|
|
6729
|
+
readonly timePosition: import("@angular/core").InputSignal<"end" | "below">;
|
|
6518
6730
|
/** Solid dot colour of an item's `dotVariant`, or null (then `tone` colours it). */
|
|
6519
6731
|
dotColor(item: TimelineItem): string | null;
|
|
6520
6732
|
static ɵfac: i0.ɵɵFactoryDeclaration<TimelineComponent, never>;
|
|
@@ -6642,6 +6854,304 @@ export declare class ImagePreviewComponent {
|
|
|
6642
6854
|
};
|
|
6643
6855
|
}, {}, never, never, true, never>;
|
|
6644
6856
|
}
|
|
6857
|
+
export type ImageFit = 'contain' | 'cover' | 'fill' | 'scale-down';
|
|
6858
|
+
export type ImageRadius = 'none' | 'sm' | 'md' | 'lg' | 'full';
|
|
6859
|
+
export type ImageAlign = 'start' | 'center' | 'end';
|
|
6860
|
+
/**
|
|
6861
|
+
* A content image of any size (a logo, a product photo, a banner) - the bigger sibling of `ui-image-preview`, which is a
|
|
6862
|
+
* small fixed-size thumbnail. The whole image is shown (`fit="contain"`) unless you ask for `cover`.
|
|
6863
|
+
*
|
|
6864
|
+
* <ui-image src="/logo.png" alt="Peaceful Pines Crematory" maxHeight="48px" /> <!-- natural size, capped -->
|
|
6865
|
+
* <ui-image [src]="p.imageUrl" [alt]="p.name" width="100%" aspectRatio="4 / 3" radius="md" [bordered]="true" />
|
|
6866
|
+
* <ui-image [src]="hero" alt="" fit="cover" width="100%" height="200px" [priority]="true" />
|
|
6867
|
+
*
|
|
6868
|
+
* - `alt`: required for meaningful images; '' (default) marks it decorative. The placeholder is `role="img"` named by `alt`
|
|
6869
|
+
* (or hidden when decorative).
|
|
6870
|
+
* - Size: `width` / `height` (CSS lengths, e.g. "200px", "100%") fix the box and the image fills it per `fit`; without them
|
|
6871
|
+
* the image keeps its natural size, capped by `maxWidth` (default 100%) and `maxHeight`. `aspectRatio` ("4 / 3", "1")
|
|
6872
|
+
* reserves the space before the image loads so the page does not jump.
|
|
6873
|
+
* - `radius` none | sm | md | lg | full, `bordered`, `align` (start | center | end, for an image narrower than its row).
|
|
6874
|
+
* - `placeholder` (default true): a neutral icon in the same box when there is no `src` or it fails to load. false renders nothing then.
|
|
6875
|
+
* - `priority`: above-the-fold image - loads eagerly with high fetch priority. Otherwise `loading="lazy"` and async decoding.
|
|
6876
|
+
* - Outputs `loaded` and `failed`. A new `src` (or a changed `retryKey`) gets a fresh chance to load.
|
|
6877
|
+
*/
|
|
6878
|
+
export declare class ImageComponent {
|
|
6879
|
+
/** Image URL (or data URL). Blank shows the placeholder. */
|
|
6880
|
+
readonly src: import("@angular/core").InputSignal<string | null | undefined>;
|
|
6881
|
+
/** Alt text; '' (default) marks the image decorative. */
|
|
6882
|
+
readonly alt: import("@angular/core").InputSignal<string>;
|
|
6883
|
+
readonly fit: import("@angular/core").InputSignal<ImageFit>;
|
|
6884
|
+
/** CSS width of the box (e.g. "200px", "100%"). Empty = natural width. */
|
|
6885
|
+
readonly width: import("@angular/core").InputSignal<string>;
|
|
6886
|
+
/** CSS height of the box. Empty = natural height. */
|
|
6887
|
+
readonly height: import("@angular/core").InputSignal<string>;
|
|
6888
|
+
readonly maxWidth: import("@angular/core").InputSignal<string>;
|
|
6889
|
+
readonly maxHeight: import("@angular/core").InputSignal<string>;
|
|
6890
|
+
/** Minimum height of the image box (any CSS length). Empty = none. */
|
|
6891
|
+
readonly minHeight: import("@angular/core").InputSignal<string>;
|
|
6892
|
+
/** CSS aspect-ratio, e.g. "4 / 3". Reserves the space while the image loads. */
|
|
6893
|
+
readonly aspectRatio: import("@angular/core").InputSignal<string>;
|
|
6894
|
+
readonly radius: import("@angular/core").InputSignal<ImageRadius>;
|
|
6895
|
+
readonly bordered: import("@angular/core").InputSignal<boolean>;
|
|
6896
|
+
readonly align: import("@angular/core").InputSignal<ImageAlign>;
|
|
6897
|
+
/** Show a neutral placeholder when there is no usable image. false = render nothing. */
|
|
6898
|
+
readonly placeholder: import("@angular/core").InputSignal<boolean>;
|
|
6899
|
+
/** Above-the-fold image: eager loading with high fetch priority. */
|
|
6900
|
+
readonly priority: import("@angular/core").InputSignal<boolean>;
|
|
6901
|
+
/** Bump to retry a failed image with the same `src`. */
|
|
6902
|
+
readonly retryKey: import("@angular/core").InputSignal<unknown>;
|
|
6903
|
+
readonly loaded: import("@angular/core").OutputEmitterRef<void>;
|
|
6904
|
+
readonly failed: import("@angular/core").OutputEmitterRef<void>;
|
|
6905
|
+
protected readonly _failed: import("@angular/core").WritableSignal<boolean>;
|
|
6906
|
+
protected readonly _url: import("@angular/core").Signal<string | null>;
|
|
6907
|
+
protected readonly radiusCss: import("@angular/core").Signal<string>;
|
|
6908
|
+
protected readonly imgWidth: import("@angular/core").Signal<string | null>;
|
|
6909
|
+
protected readonly imgHeight: import("@angular/core").Signal<string | null>;
|
|
6910
|
+
/** The placeholder needs a real box when the caller gave none. */
|
|
6911
|
+
protected readonly boxWidth: import("@angular/core").Signal<string | null>;
|
|
6912
|
+
protected readonly boxHeight: import("@angular/core").Signal<string | null>;
|
|
6913
|
+
protected readonly isBlock: import("@angular/core").Signal<boolean>;
|
|
6914
|
+
constructor();
|
|
6915
|
+
protected _onError(): void;
|
|
6916
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ImageComponent, never>;
|
|
6917
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ImageComponent, "ui-image", never, {
|
|
6918
|
+
"src": {
|
|
6919
|
+
"alias": "src";
|
|
6920
|
+
"required": false;
|
|
6921
|
+
"isSignal": true;
|
|
6922
|
+
};
|
|
6923
|
+
"alt": {
|
|
6924
|
+
"alias": "alt";
|
|
6925
|
+
"required": false;
|
|
6926
|
+
"isSignal": true;
|
|
6927
|
+
};
|
|
6928
|
+
"fit": {
|
|
6929
|
+
"alias": "fit";
|
|
6930
|
+
"required": false;
|
|
6931
|
+
"isSignal": true;
|
|
6932
|
+
};
|
|
6933
|
+
"width": {
|
|
6934
|
+
"alias": "width";
|
|
6935
|
+
"required": false;
|
|
6936
|
+
"isSignal": true;
|
|
6937
|
+
};
|
|
6938
|
+
"height": {
|
|
6939
|
+
"alias": "height";
|
|
6940
|
+
"required": false;
|
|
6941
|
+
"isSignal": true;
|
|
6942
|
+
};
|
|
6943
|
+
"maxWidth": {
|
|
6944
|
+
"alias": "maxWidth";
|
|
6945
|
+
"required": false;
|
|
6946
|
+
"isSignal": true;
|
|
6947
|
+
};
|
|
6948
|
+
"maxHeight": {
|
|
6949
|
+
"alias": "maxHeight";
|
|
6950
|
+
"required": false;
|
|
6951
|
+
"isSignal": true;
|
|
6952
|
+
};
|
|
6953
|
+
"minHeight": {
|
|
6954
|
+
"alias": "minHeight";
|
|
6955
|
+
"required": false;
|
|
6956
|
+
"isSignal": true;
|
|
6957
|
+
};
|
|
6958
|
+
"aspectRatio": {
|
|
6959
|
+
"alias": "aspectRatio";
|
|
6960
|
+
"required": false;
|
|
6961
|
+
"isSignal": true;
|
|
6962
|
+
};
|
|
6963
|
+
"radius": {
|
|
6964
|
+
"alias": "radius";
|
|
6965
|
+
"required": false;
|
|
6966
|
+
"isSignal": true;
|
|
6967
|
+
};
|
|
6968
|
+
"bordered": {
|
|
6969
|
+
"alias": "bordered";
|
|
6970
|
+
"required": false;
|
|
6971
|
+
"isSignal": true;
|
|
6972
|
+
};
|
|
6973
|
+
"align": {
|
|
6974
|
+
"alias": "align";
|
|
6975
|
+
"required": false;
|
|
6976
|
+
"isSignal": true;
|
|
6977
|
+
};
|
|
6978
|
+
"placeholder": {
|
|
6979
|
+
"alias": "placeholder";
|
|
6980
|
+
"required": false;
|
|
6981
|
+
"isSignal": true;
|
|
6982
|
+
};
|
|
6983
|
+
"priority": {
|
|
6984
|
+
"alias": "priority";
|
|
6985
|
+
"required": false;
|
|
6986
|
+
"isSignal": true;
|
|
6987
|
+
};
|
|
6988
|
+
"retryKey": {
|
|
6989
|
+
"alias": "retryKey";
|
|
6990
|
+
"required": false;
|
|
6991
|
+
"isSignal": true;
|
|
6992
|
+
};
|
|
6993
|
+
}, {
|
|
6994
|
+
"loaded": "loaded";
|
|
6995
|
+
"failed": "failed";
|
|
6996
|
+
}, never, never, true, never>;
|
|
6997
|
+
}
|
|
6998
|
+
/** One picture of a `ui-image-gallery`. */
|
|
6999
|
+
export interface GalleryImage {
|
|
7000
|
+
src: string;
|
|
7001
|
+
/** Alt text of this picture. Defaults to "Image N of M". */
|
|
7002
|
+
alt?: string;
|
|
7003
|
+
}
|
|
7004
|
+
/**
|
|
7005
|
+
* Image gallery (a "slideshow"): one large picture with previous / next buttons, a counter and dots. Put it inside a
|
|
7006
|
+
* `ui-modal` for a lightbox, or inline on a page.
|
|
7007
|
+
*
|
|
7008
|
+
* <ui-image-gallery [images]="[{ src: a, alt: 'Front' }, { src: b, alt: 'Side' }]" [(index)]="i" ariaLabel="Photos of the urn" />
|
|
7009
|
+
*
|
|
7010
|
+
* - `images`: the pictures. With a single picture there are no buttons, counter or dots.
|
|
7011
|
+
* - `index` (two-way, default 0): the shown picture; values outside the list are clamped.
|
|
7012
|
+
* - `loop` (default true): Next after the last goes to the first, Previous before the first to the last. false disables
|
|
7013
|
+
* the button at either end.
|
|
7014
|
+
* - `showDots` / `showCounter` (default true), `aspectRatio` (default "4 / 3"), `maxHeight` (default "70vh"), `fit` (default contain).
|
|
7015
|
+
* - Keyboard: with focus inside the gallery, ArrowLeft / ArrowRight (and Home / End) change the picture. The picture
|
|
7016
|
+
* change is announced ("Image 2 of 5: <alt>") through an always-present live region.
|
|
7017
|
+
* - Accessibility: a labelled group (`ariaLabel`, default "Image gallery") described as a carousel; the buttons are named
|
|
7018
|
+
* "Previous image" / "Next image"; each dot is a button "Show image N of M" with `aria-current` on the shown one.
|
|
7019
|
+
*/
|
|
7020
|
+
export declare class ImageGalleryComponent {
|
|
7021
|
+
readonly images: import("@angular/core").InputSignal<GalleryImage[]>;
|
|
7022
|
+
/** Shown picture (0-based). Two-way. */
|
|
7023
|
+
readonly index: import("@angular/core").ModelSignal<number>;
|
|
7024
|
+
readonly loop: import("@angular/core").InputSignal<boolean>;
|
|
7025
|
+
readonly showDots: import("@angular/core").InputSignal<boolean>;
|
|
7026
|
+
readonly showCounter: import("@angular/core").InputSignal<boolean>;
|
|
7027
|
+
readonly aspectRatio: import("@angular/core").InputSignal<string>;
|
|
7028
|
+
readonly maxHeight: import("@angular/core").InputSignal<string>;
|
|
7029
|
+
readonly fit: import("@angular/core").InputSignal<"contain" | "cover">;
|
|
7030
|
+
readonly ariaLabel: import("@angular/core").InputSignal<string>;
|
|
7031
|
+
/**
|
|
7032
|
+
* true = when the gallery sits in a `ui-modal`, the dialog opens with focus on the gallery's "Next image" button (or "Previous image" when
|
|
7033
|
+
* Next is disabled at the last picture of a non-looping gallery), so the arrow keys work at once without a Tab. With a single picture there are
|
|
7034
|
+
* no buttons, so the dialog keeps its normal initial focus. Default false: unchanged.
|
|
7035
|
+
*/
|
|
7036
|
+
readonly autofocus: import("@angular/core").InputSignal<boolean>;
|
|
7037
|
+
protected readonly count: import("@angular/core").Signal<number>;
|
|
7038
|
+
/** `index` clamped into the list. */
|
|
7039
|
+
protected readonly position: import("@angular/core").Signal<number>;
|
|
7040
|
+
protected readonly current: import("@angular/core").Signal<GalleryImage>;
|
|
7041
|
+
protected readonly currentAlt: import("@angular/core").Signal<string>;
|
|
7042
|
+
protected readonly autofocusNext: import("@angular/core").Signal<boolean>;
|
|
7043
|
+
protected readonly autofocusPrev: import("@angular/core").Signal<boolean>;
|
|
7044
|
+
protected readonly canPrev: import("@angular/core").Signal<boolean>;
|
|
7045
|
+
protected readonly canNext: import("@angular/core").Signal<boolean>;
|
|
7046
|
+
protected readonly announcement: import("@angular/core").Signal<string>;
|
|
7047
|
+
prev(): void;
|
|
7048
|
+
next(): void;
|
|
7049
|
+
go(i: number): void;
|
|
7050
|
+
protected onKey(e: KeyboardEvent): void;
|
|
7051
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ImageGalleryComponent, never>;
|
|
7052
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ImageGalleryComponent, "ui-image-gallery", never, {
|
|
7053
|
+
"images": {
|
|
7054
|
+
"alias": "images";
|
|
7055
|
+
"required": false;
|
|
7056
|
+
"isSignal": true;
|
|
7057
|
+
};
|
|
7058
|
+
"index": {
|
|
7059
|
+
"alias": "index";
|
|
7060
|
+
"required": false;
|
|
7061
|
+
"isSignal": true;
|
|
7062
|
+
};
|
|
7063
|
+
"loop": {
|
|
7064
|
+
"alias": "loop";
|
|
7065
|
+
"required": false;
|
|
7066
|
+
"isSignal": true;
|
|
7067
|
+
};
|
|
7068
|
+
"showDots": {
|
|
7069
|
+
"alias": "showDots";
|
|
7070
|
+
"required": false;
|
|
7071
|
+
"isSignal": true;
|
|
7072
|
+
};
|
|
7073
|
+
"showCounter": {
|
|
7074
|
+
"alias": "showCounter";
|
|
7075
|
+
"required": false;
|
|
7076
|
+
"isSignal": true;
|
|
7077
|
+
};
|
|
7078
|
+
"aspectRatio": {
|
|
7079
|
+
"alias": "aspectRatio";
|
|
7080
|
+
"required": false;
|
|
7081
|
+
"isSignal": true;
|
|
7082
|
+
};
|
|
7083
|
+
"maxHeight": {
|
|
7084
|
+
"alias": "maxHeight";
|
|
7085
|
+
"required": false;
|
|
7086
|
+
"isSignal": true;
|
|
7087
|
+
};
|
|
7088
|
+
"fit": {
|
|
7089
|
+
"alias": "fit";
|
|
7090
|
+
"required": false;
|
|
7091
|
+
"isSignal": true;
|
|
7092
|
+
};
|
|
7093
|
+
"ariaLabel": {
|
|
7094
|
+
"alias": "ariaLabel";
|
|
7095
|
+
"required": false;
|
|
7096
|
+
"isSignal": true;
|
|
7097
|
+
};
|
|
7098
|
+
"autofocus": {
|
|
7099
|
+
"alias": "autofocus";
|
|
7100
|
+
"required": false;
|
|
7101
|
+
"isSignal": true;
|
|
7102
|
+
};
|
|
7103
|
+
}, {
|
|
7104
|
+
"index": "indexChange";
|
|
7105
|
+
}, never, never, true, never>;
|
|
7106
|
+
}
|
|
7107
|
+
export type LiveRegionPoliteness = 'polite' | 'assertive';
|
|
7108
|
+
/**
|
|
7109
|
+
* A screen-reader announcement area. The element is always in the DOM and only its text changes, which is what makes
|
|
7110
|
+
* assistive tech (VoiceOver / Safari included) announce reliably - a live region that is inserted together with its text
|
|
7111
|
+
* often is not announced.
|
|
7112
|
+
*
|
|
7113
|
+
* <ui-live-region [message]="announcement()" /> <!-- "Step 3 of 5: Deceased" -->
|
|
7114
|
+
* <ui-live-region [message]="error()" politeness="assertive" /> <!-- role="alert" -->
|
|
7115
|
+
* <ui-live-region [message]="status()" [visible]="true" /> <!-- also shown on screen -->
|
|
7116
|
+
*
|
|
7117
|
+
* By default it is visually hidden (still read aloud). `politeness` "polite" (default, `role="status"`) waits for the
|
|
7118
|
+
* user to be idle; "assertive" (`role="alert"`) interrupts. `atomic` (default true) reads the whole message again when it
|
|
7119
|
+
* changes. Set the message to '' to clear it. Announcing the same text twice in a row needs a different message in
|
|
7120
|
+
* between (for example clear it first); screen readers ignore an unchanged region.
|
|
7121
|
+
*/
|
|
7122
|
+
export declare class LiveRegionComponent {
|
|
7123
|
+
/** The text to announce. */
|
|
7124
|
+
readonly message: import("@angular/core").InputSignal<string>;
|
|
7125
|
+
readonly politeness: import("@angular/core").InputSignal<LiveRegionPoliteness>;
|
|
7126
|
+
/** Read the whole message (not just the changed part) when it changes. */
|
|
7127
|
+
readonly atomic: import("@angular/core").InputSignal<boolean>;
|
|
7128
|
+
/** Show the text on screen too. Default false: visually hidden, still announced. */
|
|
7129
|
+
readonly visible: import("@angular/core").InputSignal<boolean>;
|
|
7130
|
+
protected readonly role: import("@angular/core").Signal<"status" | "alert">;
|
|
7131
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<LiveRegionComponent, never>;
|
|
7132
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<LiveRegionComponent, "ui-live-region", never, {
|
|
7133
|
+
"message": {
|
|
7134
|
+
"alias": "message";
|
|
7135
|
+
"required": false;
|
|
7136
|
+
"isSignal": true;
|
|
7137
|
+
};
|
|
7138
|
+
"politeness": {
|
|
7139
|
+
"alias": "politeness";
|
|
7140
|
+
"required": false;
|
|
7141
|
+
"isSignal": true;
|
|
7142
|
+
};
|
|
7143
|
+
"atomic": {
|
|
7144
|
+
"alias": "atomic";
|
|
7145
|
+
"required": false;
|
|
7146
|
+
"isSignal": true;
|
|
7147
|
+
};
|
|
7148
|
+
"visible": {
|
|
7149
|
+
"alias": "visible";
|
|
7150
|
+
"required": false;
|
|
7151
|
+
"isSignal": true;
|
|
7152
|
+
};
|
|
7153
|
+
}, {}, never, never, true, never>;
|
|
7154
|
+
}
|
|
6645
7155
|
/**
|
|
6646
7156
|
* Inline field error for controls that have no `error` input of their own — e.g. an app-specific
|
|
6647
7157
|
* picker. Renders exactly like the library inputs' own field error (small red text under the field,
|
|
@@ -7038,6 +7548,8 @@ export declare class RadioComponent {
|
|
|
7038
7548
|
readonly description: import("@angular/core").InputSignal<string>;
|
|
7039
7549
|
/** Accessible name when there is no visible `label`. */
|
|
7040
7550
|
readonly ariaLabel: import("@angular/core").InputSignal<string>;
|
|
7551
|
+
/** `data-testid` of the native radio input; none when empty. */
|
|
7552
|
+
readonly testId: import("@angular/core").InputSignal<string>;
|
|
7041
7553
|
readonly value: import("@angular/core").InputSignal<string>;
|
|
7042
7554
|
/** Radios with the same `name` form one keyboard (arrow key) group. */
|
|
7043
7555
|
readonly name: import("@angular/core").InputSignal<string>;
|
|
@@ -7079,6 +7591,11 @@ export declare class RadioComponent {
|
|
|
7079
7591
|
"required": false;
|
|
7080
7592
|
"isSignal": true;
|
|
7081
7593
|
};
|
|
7594
|
+
"testId": {
|
|
7595
|
+
"alias": "testId";
|
|
7596
|
+
"required": false;
|
|
7597
|
+
"isSignal": true;
|
|
7598
|
+
};
|
|
7082
7599
|
"value": {
|
|
7083
7600
|
"alias": "value";
|
|
7084
7601
|
"required": false;
|
|
@@ -7487,7 +8004,7 @@ export declare class PdfHotspotComponent {
|
|
|
7487
8004
|
/** `ready`: clickable; `blocked`: disabled (a prerequisite is missing); `signed`: shows `image`. */
|
|
7488
8005
|
readonly state: import("@angular/core").InputSignal<"ready" | "blocked" | "signed">;
|
|
7489
8006
|
/** `warning` gives the ready state an amber look (e.g. for initials), default is blue. */
|
|
7490
|
-
readonly tone: import("@angular/core").InputSignal<"
|
|
8007
|
+
readonly tone: import("@angular/core").InputSignal<"primary" | "warning">;
|
|
7491
8008
|
/** Text of the ready button (e.g. "Sign Here"). */
|
|
7492
8009
|
readonly label: import("@angular/core").InputSignal<string>;
|
|
7493
8010
|
/** Text of the blocked button (e.g. "Add signature above"). */
|
|
@@ -7580,7 +8097,11 @@ export declare class PdfHotspotComponent {
|
|
|
7580
8097
|
* - `<div card-header-leading>`: something before the title block, such as a logo or an icon.
|
|
7581
8098
|
* - `<ng-container card-header>`: your own header content, shown under the title (or instead of it when no title is set).
|
|
7582
8099
|
* - `<ng-container card-header-action>`: buttons or links on the right side of the header.
|
|
7583
|
-
* - `showEdit` + `editLabel` + `(editClick)`: the built-in Edit button.
|
|
8100
|
+
* - `showEdit` + `editLabel` + `(editClick)`: the built-in Edit button. `editAriaLabel` gives it a longer accessible name
|
|
8101
|
+
* ("Edit informant information") when the visible label alone is ambiguous; it should contain the visible label.
|
|
8102
|
+
* - `fill`: the card stretches to the height of its container (a grid cell or flex item) and its body grows, so cards in
|
|
8103
|
+
* one row end at the same height; the default card is only as tall as its content.
|
|
8104
|
+
* Use it in grid / flex cells: the spacing between cells comes from the gap, so a filled card's margin-bottom is 0 (the default card keeps 16px).
|
|
7584
8105
|
* - `background`: the card's background colour (any CSS colour; default white).
|
|
7585
8106
|
* - `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
8107
|
* - The body has built-in padding (16px 18px, matching the header's 18px side padding); there is no padding input.
|
|
@@ -7605,7 +8126,7 @@ export declare class DetailCardComponent {
|
|
|
7605
8126
|
/** 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
8127
|
readonly uppercaseTitle: import("@angular/core").InputSignal<boolean>;
|
|
7607
8128
|
/** 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 |
|
|
8129
|
+
readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 3 | 4 | 5 | 6 | null>;
|
|
7609
8130
|
/** Optional id for the title text; the card is then labelled by it. Without it the title is the card's aria-label. */
|
|
7610
8131
|
readonly titleId: import("@angular/core").InputSignal<string>;
|
|
7611
8132
|
/** Accessible name of the card when the header gives none (no header, or no title). A visible title wins; blank = no name. */
|
|
@@ -7626,6 +8147,14 @@ export declare class DetailCardComponent {
|
|
|
7626
8147
|
readonly showEdit: import("@angular/core").InputSignal<boolean>;
|
|
7627
8148
|
readonly editLabel: import("@angular/core").InputSignal<string>;
|
|
7628
8149
|
readonly editClick: import("@angular/core").OutputEmitterRef<void>;
|
|
8150
|
+
/** `data-testid` of the built-in Edit button (on the `ui-button` host); none when empty. */
|
|
8151
|
+
readonly editTestId: import("@angular/core").InputSignal<string>;
|
|
8152
|
+
/** false = no pencil icon in the Edit button (text only). Default true: unchanged. */
|
|
8153
|
+
readonly editIcon: import("@angular/core").InputSignal<boolean>;
|
|
8154
|
+
/** Accessible name of the Edit button, e.g. "Edit informant information". Empty = the visible `editLabel`. */
|
|
8155
|
+
readonly editAriaLabel: import("@angular/core").InputSignal<string>;
|
|
8156
|
+
/** true = the card fills the height of its container (a grid cell / flex item) so sibling cards line up; the body grows. Spacing between cells comes from the gap: the filled card's margin-bottom is 0. Default false: unchanged. */
|
|
8157
|
+
readonly fill: import("@angular/core").InputSignal<boolean>;
|
|
7629
8158
|
/** The group's aria-label: the visible title (unless `titleId` names the card instead), else `ariaLabel`, else none. */
|
|
7630
8159
|
groupLabel(): string | null;
|
|
7631
8160
|
/** The body is open unless the card has a header that is collapsible and was collapsed. */
|
|
@@ -7700,6 +8229,26 @@ export declare class DetailCardComponent {
|
|
|
7700
8229
|
"required": false;
|
|
7701
8230
|
"isSignal": true;
|
|
7702
8231
|
};
|
|
8232
|
+
"editTestId": {
|
|
8233
|
+
"alias": "editTestId";
|
|
8234
|
+
"required": false;
|
|
8235
|
+
"isSignal": true;
|
|
8236
|
+
};
|
|
8237
|
+
"editIcon": {
|
|
8238
|
+
"alias": "editIcon";
|
|
8239
|
+
"required": false;
|
|
8240
|
+
"isSignal": true;
|
|
8241
|
+
};
|
|
8242
|
+
"editAriaLabel": {
|
|
8243
|
+
"alias": "editAriaLabel";
|
|
8244
|
+
"required": false;
|
|
8245
|
+
"isSignal": true;
|
|
8246
|
+
};
|
|
8247
|
+
"fill": {
|
|
8248
|
+
"alias": "fill";
|
|
8249
|
+
"required": false;
|
|
8250
|
+
"isSignal": true;
|
|
8251
|
+
};
|
|
7703
8252
|
}, {
|
|
7704
8253
|
"expanded": "expandedChange";
|
|
7705
8254
|
"editClick": "editClick";
|
|
@@ -8119,6 +8668,12 @@ export type ColumnsAlign = 'start' | 'center' | 'stretch';
|
|
|
8119
8668
|
* - `collapseAt`: sm (480px) | md (768px) | lg (1024px) | never. Below that viewport width the columns become one.
|
|
8120
8669
|
* Plain media queries are used (not container queries) because they behave the same in every supported browser.
|
|
8121
8670
|
* - `align`: start | center | stretch (default start) - how cells of different heights line up.
|
|
8671
|
+
* - Responsive tiers (optional): `countBelowLg` (viewport <= 1024px), `countBelowMd` (<= 768px) and `countBelowSm` (<= 480px)
|
|
8672
|
+
* give a different column count (1-4) at narrower widths. Each tier falls back to the next wider one, then to `count`, so
|
|
8673
|
+
* a grid that sets none of them is unchanged. `collapseAt` is applied last: a width at or below it is one column.
|
|
8674
|
+
* A product grid of 1 column on phones, 2 on tablets and 3 on desktop:
|
|
8675
|
+
* <ui-columns [count]="3" [countBelowLg]="2" collapseAt="md" gap="md"> ... </ui-columns>
|
|
8676
|
+
* The same grid with 2 columns from phone width up (no stacking): `[count]="3" [countBelowLg]="2" collapseAt="never"`.
|
|
8122
8677
|
*
|
|
8123
8678
|
* <ui-columns>
|
|
8124
8679
|
* <ui-form-section label="Email"> ... </ui-form-section>
|
|
@@ -8131,7 +8686,32 @@ export declare class ColumnsComponent {
|
|
|
8131
8686
|
readonly gap: import("@angular/core").InputSignal<string>;
|
|
8132
8687
|
readonly collapseAt: import("@angular/core").InputSignal<ColumnsCollapse>;
|
|
8133
8688
|
readonly align: import("@angular/core").InputSignal<ColumnsAlign>;
|
|
8689
|
+
/** Column count at viewport widths <= 1024px (falls back to `count`). */
|
|
8690
|
+
readonly countBelowLg: import("@angular/core").InputSignal<ColumnsCount | null>;
|
|
8691
|
+
/** Column count at <= 768px (falls back to `countBelowLg`, then `count`). */
|
|
8692
|
+
readonly countBelowMd: import("@angular/core").InputSignal<ColumnsCount | null>;
|
|
8693
|
+
/** Column count at <= 480px (falls back to `countBelowMd`, then `countBelowLg`, then `count`). */
|
|
8694
|
+
readonly countBelowSm: import("@angular/core").InputSignal<ColumnsCount | null>;
|
|
8695
|
+
/**
|
|
8696
|
+
* Mobile-first alternative to `count` + `countBelow*`: `countBase` columns on the narrowest screens (default 1), then `countFromSm` from 480px,
|
|
8697
|
+
* `countFromMd` from 768px, `countFromLg` from 1024px (min-width, inclusive; each tier falls back to the next narrower one). Setting any `countFrom*`
|
|
8698
|
+
* switches the grid to this mode: `count`, `countBelow*` and `collapseAt` are then ignored. Unset = unchanged.
|
|
8699
|
+
* <ui-columns [countFromMd]="2" [countFromLg]="3"> ... </ui-columns> <!-- 1 column, 2 from 768px, 3 from 1024px -->
|
|
8700
|
+
*/
|
|
8701
|
+
readonly countBase: import("@angular/core").InputSignal<ColumnsCount>;
|
|
8702
|
+
readonly countFromSm: import("@angular/core").InputSignal<ColumnsCount | null>;
|
|
8703
|
+
readonly countFromMd: import("@angular/core").InputSignal<ColumnsCount | null>;
|
|
8704
|
+
readonly countFromLg: import("@angular/core").InputSignal<ColumnsCount | null>;
|
|
8134
8705
|
protected readonly cols: import("@angular/core").Signal<ColumnsCount>;
|
|
8706
|
+
private static clampTier;
|
|
8707
|
+
protected readonly colsLg: import("@angular/core").Signal<ColumnsCount | null>;
|
|
8708
|
+
protected readonly colsMd: import("@angular/core").Signal<ColumnsCount | null>;
|
|
8709
|
+
protected readonly colsSm: import("@angular/core").Signal<ColumnsCount | null>;
|
|
8710
|
+
protected readonly fromMode: import("@angular/core").Signal<boolean>;
|
|
8711
|
+
protected readonly base: import("@angular/core").Signal<ColumnsCount | null>;
|
|
8712
|
+
protected readonly fromSm: import("@angular/core").Signal<ColumnsCount | null>;
|
|
8713
|
+
protected readonly fromMd: import("@angular/core").Signal<ColumnsCount | null>;
|
|
8714
|
+
protected readonly fromLg: import("@angular/core").Signal<ColumnsCount | null>;
|
|
8135
8715
|
protected readonly gapCss: import("@angular/core").Signal<string>;
|
|
8136
8716
|
protected readonly collapseClass: import("@angular/core").Signal<string>;
|
|
8137
8717
|
static ɵfac: i0.ɵɵFactoryDeclaration<ColumnsComponent, never>;
|
|
@@ -8156,6 +8736,41 @@ export declare class ColumnsComponent {
|
|
|
8156
8736
|
"required": false;
|
|
8157
8737
|
"isSignal": true;
|
|
8158
8738
|
};
|
|
8739
|
+
"countBelowLg": {
|
|
8740
|
+
"alias": "countBelowLg";
|
|
8741
|
+
"required": false;
|
|
8742
|
+
"isSignal": true;
|
|
8743
|
+
};
|
|
8744
|
+
"countBelowMd": {
|
|
8745
|
+
"alias": "countBelowMd";
|
|
8746
|
+
"required": false;
|
|
8747
|
+
"isSignal": true;
|
|
8748
|
+
};
|
|
8749
|
+
"countBelowSm": {
|
|
8750
|
+
"alias": "countBelowSm";
|
|
8751
|
+
"required": false;
|
|
8752
|
+
"isSignal": true;
|
|
8753
|
+
};
|
|
8754
|
+
"countBase": {
|
|
8755
|
+
"alias": "countBase";
|
|
8756
|
+
"required": false;
|
|
8757
|
+
"isSignal": true;
|
|
8758
|
+
};
|
|
8759
|
+
"countFromSm": {
|
|
8760
|
+
"alias": "countFromSm";
|
|
8761
|
+
"required": false;
|
|
8762
|
+
"isSignal": true;
|
|
8763
|
+
};
|
|
8764
|
+
"countFromMd": {
|
|
8765
|
+
"alias": "countFromMd";
|
|
8766
|
+
"required": false;
|
|
8767
|
+
"isSignal": true;
|
|
8768
|
+
};
|
|
8769
|
+
"countFromLg": {
|
|
8770
|
+
"alias": "countFromLg";
|
|
8771
|
+
"required": false;
|
|
8772
|
+
"isSignal": true;
|
|
8773
|
+
};
|
|
8159
8774
|
}, {}, never, ["*"], true, never>;
|
|
8160
8775
|
}
|
|
8161
8776
|
export type StackDirection = 'vertical' | 'horizontal';
|
|
@@ -8188,6 +8803,10 @@ export declare class StackComponent {
|
|
|
8188
8803
|
readonly align: import("@angular/core").InputSignal<StackAlign>;
|
|
8189
8804
|
readonly justify: import("@angular/core").InputSignal<StackJustify>;
|
|
8190
8805
|
readonly wrap: import("@angular/core").InputSignal<boolean>;
|
|
8806
|
+
/** Minimum height of the stack (any CSS length, e.g. "12rem"); with `justify="center"` it centres the content vertically. Empty = none. */
|
|
8807
|
+
readonly minHeight: import("@angular/core").InputSignal<string>;
|
|
8808
|
+
/** Width of the stack (any CSS length or "100%"). Empty = the normal block width. */
|
|
8809
|
+
readonly width: import("@angular/core").InputSignal<string>;
|
|
8191
8810
|
protected readonly gapCss: import("@angular/core").Signal<string>;
|
|
8192
8811
|
protected readonly alignCss: import("@angular/core").Signal<string>;
|
|
8193
8812
|
protected readonly justifyCss: import("@angular/core").Signal<string>;
|
|
@@ -8218,6 +8837,16 @@ export declare class StackComponent {
|
|
|
8218
8837
|
"required": false;
|
|
8219
8838
|
"isSignal": true;
|
|
8220
8839
|
};
|
|
8840
|
+
"minHeight": {
|
|
8841
|
+
"alias": "minHeight";
|
|
8842
|
+
"required": false;
|
|
8843
|
+
"isSignal": true;
|
|
8844
|
+
};
|
|
8845
|
+
"width": {
|
|
8846
|
+
"alias": "width";
|
|
8847
|
+
"required": false;
|
|
8848
|
+
"isSignal": true;
|
|
8849
|
+
};
|
|
8221
8850
|
}, {}, never, ["*"], true, never>;
|
|
8222
8851
|
}
|
|
8223
8852
|
export type ActionBarAlign = 'start' | 'center' | 'end' | 'between';
|
|
@@ -8292,4 +8921,370 @@ export declare class ActionBarComponent {
|
|
|
8292
8921
|
"isSignal": true;
|
|
8293
8922
|
};
|
|
8294
8923
|
}, {}, never, ["*"], true, never>;
|
|
8295
|
-
}
|
|
8924
|
+
}
|
|
8925
|
+
/** Pure date helpers for `ui-calendar`. Dates are plain `YYYY-MM-DD` strings and times `HH:mm`; nothing here parses a non-ISO string. */
|
|
8926
|
+
type CalendarViewMode = 'month' | 'week' | 'agenda';
|
|
8927
|
+
interface CalendarDay {
|
|
8928
|
+
dateStr: string;
|
|
8929
|
+
dayNum: number;
|
|
8930
|
+
isToday: boolean;
|
|
8931
|
+
isCurrentMonth: boolean;
|
|
8932
|
+
isWeekend: boolean;
|
|
8933
|
+
}
|
|
8934
|
+
interface CalendarRange {
|
|
8935
|
+
view: CalendarViewMode;
|
|
8936
|
+
/** First visible date, `YYYY-MM-DD`. */
|
|
8937
|
+
start: string;
|
|
8938
|
+
/** Last visible date (inclusive), `YYYY-MM-DD`. */
|
|
8939
|
+
end: string;
|
|
8940
|
+
/** The date the view is anchored on. */
|
|
8941
|
+
anchor: Date;
|
|
8942
|
+
}
|
|
8943
|
+
declare const WEEK_DAY_LABELS: string[];
|
|
8944
|
+
declare function toDateStr(d: Date): string;
|
|
8945
|
+
/** `YYYY-MM-DD` → local Date at midnight (ISO local form, parsed the same way in every browser). */
|
|
8946
|
+
declare function fromDateStr(dateStr: string): Date;
|
|
8947
|
+
/** The 42 cells (6 weeks, Sunday first) of the month grid containing `anchor`. */
|
|
8948
|
+
declare function buildMonthCells(anchor: Date, todayStr: string): CalendarDay[];
|
|
8949
|
+
/** The 7 days (Sunday first) of the week containing `anchor`. */
|
|
8950
|
+
declare function buildWeekDays(anchor: Date, todayStr: string): CalendarDay[];
|
|
8951
|
+
/** Month view: the whole 6-week grid. Week view: the 7 days. Agenda view: the anchor month and the next one. */
|
|
8952
|
+
declare function rangeFor(view: CalendarViewMode, anchor: Date, todayStr: string): CalendarRange;
|
|
8953
|
+
/**
|
|
8954
|
+
* Anchor after pressing Previous (`-1`) / Next (`1`): a week, two months (agenda, on the 1st) or one month. A month step keeps the
|
|
8955
|
+
* day of the month (clamped to the target month's length), so switching to the week view afterwards shows a sensible week.
|
|
8956
|
+
*/
|
|
8957
|
+
declare function shiftAnchor(view: CalendarViewMode, anchor: Date, direction: -1 | 1): Date;
|
|
8958
|
+
/** `Wednesday, October 21, 2026` — one cached formatter, used for every cell's screen-reader name. */
|
|
8959
|
+
declare function formatDayLabel(dateStr: string): string;
|
|
8960
|
+
declare function periodLabelFor(view: CalendarViewMode, anchor: Date, todayStr: string): string;
|
|
8961
|
+
/** `14:30` → `2:30 PM`. */
|
|
8962
|
+
declare function formatTime$1(time: string): string;
|
|
8963
|
+
declare function formatHour(h: number): string;
|
|
8964
|
+
/** Pixel height of one hour row in the week view. */
|
|
8965
|
+
declare const HOUR_HEIGHT = 60;
|
|
8966
|
+
/**
|
|
8967
|
+
* Top offset and height (px) of a timed event in a week grid whose first row is `startHour` and last row `endHour`.
|
|
8968
|
+
* The box is clamped to the visible rows (an event that starts before `startHour` or ends after the last row is cut, never drawn outside).
|
|
8969
|
+
*/
|
|
8970
|
+
declare function timedBox(startTime: string | undefined, endTime: string | undefined, startHour: number, endHour?: number): {
|
|
8971
|
+
top: number;
|
|
8972
|
+
height: number;
|
|
8973
|
+
};
|
|
8974
|
+
interface CalendarLane {
|
|
8975
|
+
lane: number;
|
|
8976
|
+
lanes: number;
|
|
8977
|
+
}
|
|
8978
|
+
/**
|
|
8979
|
+
* Side-by-side lanes for events that overlap in time. Events are grouped into clusters of transitively overlapping events; inside a
|
|
8980
|
+
* cluster each event takes the first free lane and every event of the cluster shares the cluster's lane count.
|
|
8981
|
+
*/
|
|
8982
|
+
declare function layoutLanes(boxes: {
|
|
8983
|
+
id: string;
|
|
8984
|
+
top: number;
|
|
8985
|
+
height: number;
|
|
8986
|
+
}[]): Record<string, CalendarLane>;
|
|
8987
|
+
/** One thing on the calendar. The host maps its own records to this shape. */
|
|
8988
|
+
export interface CalendarItem {
|
|
8989
|
+
/** Unique across ALL items passed in (prefix ids by source when merging lists, e.g. `task-…`, `event-…`). */
|
|
8990
|
+
id: string;
|
|
8991
|
+
title: string;
|
|
8992
|
+
/** Local calendar day, `YYYY-MM-DD`. */
|
|
8993
|
+
date: string;
|
|
8994
|
+
/** `HH:mm` (24 hour). Without it (or with `allDay`) the item is an all-day item in the week view. */
|
|
8995
|
+
startTime?: string;
|
|
8996
|
+
endTime?: string;
|
|
8997
|
+
allDay?: boolean;
|
|
8998
|
+
/** Filter key; matched against `CalendarFilter.value`. */
|
|
8999
|
+
type?: string;
|
|
9000
|
+
/** Accent colour (left border / bar) and soft background of the chip, any CSS colour. */
|
|
9001
|
+
color: string;
|
|
9002
|
+
bgColor: string;
|
|
9003
|
+
/** Replaces the formatted `startTime` on chips and agenda rows (e.g. a time already converted to another time zone, or "All day"). */
|
|
9004
|
+
timeLabel?: string;
|
|
9005
|
+
/** Small marker at the end of a month chip (e.g. `T`). */
|
|
9006
|
+
tag?: string;
|
|
9007
|
+
/** Extra badges on the agenda row. */
|
|
9008
|
+
badges?: {
|
|
9009
|
+
label: string;
|
|
9010
|
+
variant: BadgeVariant;
|
|
9011
|
+
}[];
|
|
9012
|
+
/** Extra grey lines under the title on the agenda row (location, contact…). */
|
|
9013
|
+
meta?: string[];
|
|
9014
|
+
/** SVG path `d` (24x24 stroke icon) drawn before the time on month chips. */
|
|
9015
|
+
iconPath?: string;
|
|
9016
|
+
/** Strike the title through (e.g. a completed reminder). */
|
|
9017
|
+
strike?: boolean;
|
|
9018
|
+
/** Screen-reader name of the item's button; defaults to "<time> <title>". */
|
|
9019
|
+
ariaLabel?: string;
|
|
9020
|
+
}
|
|
9021
|
+
export interface CalendarFilter {
|
|
9022
|
+
value: string;
|
|
9023
|
+
label: string;
|
|
9024
|
+
color: string;
|
|
9025
|
+
bgColor?: string;
|
|
9026
|
+
}
|
|
9027
|
+
export interface CalendarMoreClick {
|
|
9028
|
+
/** `YYYY-MM-DD` */
|
|
9029
|
+
date: string;
|
|
9030
|
+
/** Every item of that day that passes the active filters, in display order. */
|
|
9031
|
+
items: CalendarItem[];
|
|
9032
|
+
}
|
|
9033
|
+
export interface CalendarSlotClick {
|
|
9034
|
+
/** `YYYY-MM-DD` */
|
|
9035
|
+
date: string;
|
|
9036
|
+
/** `HH:00` of the clicked hour row. */
|
|
9037
|
+
time: string;
|
|
9038
|
+
}
|
|
9039
|
+
/**
|
|
9040
|
+
* Month / week / agenda calendar. The host owns the data: it listens to `(rangeChange)`, loads that range and passes
|
|
9041
|
+
* the result as `items`. The calendar owns navigation, the view switcher, type filters, layout and keyboard access.
|
|
9042
|
+
*
|
|
9043
|
+
* <ui-calendar [items]="items()" [filters]="filters" [loading]="loading()" [canCreate]="canCreate()"
|
|
9044
|
+
* [(view)]="view" (rangeChange)="load($event)" (itemClick)="open($event)" (dateClick)="create($event)">
|
|
9045
|
+
* <ui-kpi-card calendar-summary ... />
|
|
9046
|
+
* <ui-button calendar-actions (click)="create()">New Event</ui-button>
|
|
9047
|
+
* </ui-calendar>
|
|
9048
|
+
*
|
|
9049
|
+
* Keep the state you bind (`loading`, `items`, `view` …) in signals: `rangeChange` fires during change detection on the first render,
|
|
9050
|
+
* so a handler that writes a plain property would raise ExpressionChangedAfterItHasBeenChecked in dev mode.
|
|
9051
|
+
*
|
|
9052
|
+
* The library toast outlet (`ui-toast`) is rendered here, like in `ui-data-table`, so a page with a calendar and no table still shows
|
|
9053
|
+
* `ToastService` messages.
|
|
9054
|
+
*
|
|
9055
|
+
* Keyboard: the month grid is a real ARIA grid whose DAY CELLS have one tab stop (roving tabindex): arrows move by day/week, Home/End jump
|
|
9056
|
+
* to the start/end of the week, Enter/Space on a day creates (when `canCreate`); the item buttons inside the cells stay in the Tab order.
|
|
9057
|
+
* In the week view each all-day cell and each day column has a visually hidden "+ Add" button that appears when focused; Enter/Space on it
|
|
9058
|
+
* creates (all-day, or the first visible hour). The initial `view` must be one of `views`.
|
|
9059
|
+
*
|
|
9060
|
+
* Content slots: `[calendar-actions]` (right of the view switcher), `[calendar-summary]` (centre of the toolbar on
|
|
9061
|
+
* desktop) and `[calendar-summary-mobile]` (shown instead of it on phones).
|
|
9062
|
+
*/
|
|
9063
|
+
export declare class CalendarComponent {
|
|
9064
|
+
/** Everything to show in the visible range. Ids must be unique across the whole list. */
|
|
9065
|
+
readonly items: import("@angular/core").InputSignal<CalendarItem[]>;
|
|
9066
|
+
readonly loading: import("@angular/core").InputSignal<boolean>;
|
|
9067
|
+
/** Active view; two-way bindable. A value that is not in `views` is replaced by the first allowed view. */
|
|
9068
|
+
readonly view: import("@angular/core").ModelSignal<CalendarViewMode>;
|
|
9069
|
+
/** Views the switcher offers. One entry hides the switcher. */
|
|
9070
|
+
readonly views: import("@angular/core").InputSignal<CalendarViewMode[]>;
|
|
9071
|
+
/** Date the visible period is anchored on; two-way bindable. */
|
|
9072
|
+
readonly anchorDate: import("@angular/core").ModelSignal<Date>;
|
|
9073
|
+
/** Filter chips (with an "All" chip first). Empty = no filter bar. */
|
|
9074
|
+
readonly filters: import("@angular/core").InputSignal<CalendarFilter[]>;
|
|
9075
|
+
readonly filterLabel: import("@angular/core").InputSignal<string>;
|
|
9076
|
+
/** `multi` toggles any number of types; `single` keeps at most one active (clicking the active chip clears it). */
|
|
9077
|
+
readonly filterMode: import("@angular/core").InputSignal<"multi" | "single">;
|
|
9078
|
+
/** Active filter values; empty = everything. Two-way bindable. */
|
|
9079
|
+
readonly activeFilters: import("@angular/core").ModelSignal<string[]>;
|
|
9080
|
+
readonly showFilterCounts: import("@angular/core").InputSignal<boolean>;
|
|
9081
|
+
/** Whether empty days / time slots can start a new item (`dateClick` / `slotClick`). Read-only users: false. */
|
|
9082
|
+
readonly canCreate: import("@angular/core").InputSignal<boolean>;
|
|
9083
|
+
/** Days before today cannot start a new item. */
|
|
9084
|
+
readonly disablePast: import("@angular/core").InputSignal<boolean>;
|
|
9085
|
+
/** Items shown per month cell before "+N more". */
|
|
9086
|
+
readonly maxVisible: import("@angular/core").InputSignal<number>;
|
|
9087
|
+
/** `inline`: time and title on one line. `stacked`: time on the first line, title below it (title hidden on phones). */
|
|
9088
|
+
readonly chipLayout: import("@angular/core").InputSignal<"inline" | "stacked">;
|
|
9089
|
+
/** Order each day's items by start time (default). Off = keep the order the host passed them in. */
|
|
9090
|
+
readonly sortByTime: import("@angular/core").InputSignal<boolean>;
|
|
9091
|
+
/** First and last hour row of the week view. */
|
|
9092
|
+
readonly startHour: import("@angular/core").InputSignal<number>;
|
|
9093
|
+
readonly endHour: import("@angular/core").InputSignal<number>;
|
|
9094
|
+
readonly emptyMessage: import("@angular/core").InputSignal<string>;
|
|
9095
|
+
/** Builds the screen-reader name of a month cell; default "<weekday, date>, N events". */
|
|
9096
|
+
readonly dayLabelFn: import("@angular/core").InputSignal<((dateStr: string, items: CalendarItem[]) => string) | null>;
|
|
9097
|
+
/** Fires on first render and whenever the view or the visible range changes: load this range, then pass `items`. */
|
|
9098
|
+
readonly rangeChange: import("@angular/core").OutputEmitterRef<CalendarRange>;
|
|
9099
|
+
readonly itemClick: import("@angular/core").OutputEmitterRef<CalendarItem>;
|
|
9100
|
+
/** Empty day clicked (month view / all-day row) — only when `canCreate` and the day is allowed. */
|
|
9101
|
+
readonly dateClick: import("@angular/core").OutputEmitterRef<string>;
|
|
9102
|
+
/** Empty hour row clicked in the week view (or Enter on a day column: the first visible hour). */
|
|
9103
|
+
readonly slotClick: import("@angular/core").OutputEmitterRef<CalendarSlotClick>;
|
|
9104
|
+
/** "+N more" clicked in a month cell. */
|
|
9105
|
+
readonly moreClick: import("@angular/core").OutputEmitterRef<CalendarMoreClick>;
|
|
9106
|
+
private readonly host;
|
|
9107
|
+
protected readonly weekDayLabels: string[];
|
|
9108
|
+
protected readonly weekDayNames: string[];
|
|
9109
|
+
protected readonly skeletonCells: number[];
|
|
9110
|
+
protected readonly formatHour: typeof formatHour;
|
|
9111
|
+
/** Today as `YYYY-MM-DD`; refreshed at local midnight, when the tab becomes visible again and when the user presses Today. */
|
|
9112
|
+
protected readonly todayStr: import("@angular/core").WritableSignal<string>;
|
|
9113
|
+
/** The month-grid day that holds the roving tab stop. */
|
|
9114
|
+
protected readonly focusedDate: import("@angular/core").WritableSignal<string | null>;
|
|
9115
|
+
private lastRangeKey;
|
|
9116
|
+
protected readonly hours: import("@angular/core").Signal<number[]>;
|
|
9117
|
+
protected readonly monthCells: import("@angular/core").Signal<CalendarDay[]>;
|
|
9118
|
+
protected readonly weekDays: import("@angular/core").Signal<CalendarDay[]>;
|
|
9119
|
+
protected readonly periodLabel: import("@angular/core").Signal<string>;
|
|
9120
|
+
protected readonly viewTabs: import("@angular/core").Signal<PillTab[]>;
|
|
9121
|
+
protected readonly typeCounts: import("@angular/core").Signal<Record<string, number>>;
|
|
9122
|
+
private readonly byDate;
|
|
9123
|
+
protected readonly agendaGroups: import("@angular/core").Signal<{
|
|
9124
|
+
dateStr: string;
|
|
9125
|
+
items: CalendarItem[];
|
|
9126
|
+
}[]>;
|
|
9127
|
+
/** Whether the day at `dateStr` may start a new item. */
|
|
9128
|
+
private clickable;
|
|
9129
|
+
/** The 6 rows of the month grid with everything a cell draws, computed once per input change. */
|
|
9130
|
+
protected readonly monthRows: import("@angular/core").Signal<{
|
|
9131
|
+
key: string;
|
|
9132
|
+
cells: {
|
|
9133
|
+
day: CalendarDay;
|
|
9134
|
+
items: CalendarItem[];
|
|
9135
|
+
visible: CalendarItem[];
|
|
9136
|
+
overflow: number;
|
|
9137
|
+
clickable: boolean;
|
|
9138
|
+
label: string;
|
|
9139
|
+
}[];
|
|
9140
|
+
}[]>;
|
|
9141
|
+
/** The 7 week columns with all-day items and the timed items laid out side by side when they overlap. */
|
|
9142
|
+
protected readonly weekColumns: import("@angular/core").Signal<{
|
|
9143
|
+
day: CalendarDay;
|
|
9144
|
+
label: string;
|
|
9145
|
+
clickable: boolean;
|
|
9146
|
+
allDay: CalendarItem[];
|
|
9147
|
+
timed: {
|
|
9148
|
+
lane: CalendarLane;
|
|
9149
|
+
top: number;
|
|
9150
|
+
height: number;
|
|
9151
|
+
item: CalendarItem;
|
|
9152
|
+
}[];
|
|
9153
|
+
}[]>;
|
|
9154
|
+
/** The month-grid day holding the tab stop: the last focused one if it is on screen, else today, else the 1st of the anchor month. */
|
|
9155
|
+
protected readonly focusDate: import("@angular/core").Signal<string>;
|
|
9156
|
+
constructor();
|
|
9157
|
+
protected isFilterActive(value: string): boolean;
|
|
9158
|
+
protected toggleFilter(value: string): void;
|
|
9159
|
+
protected clearFilters(): void;
|
|
9160
|
+
protected setView(v: CalendarViewMode): void;
|
|
9161
|
+
protected navigate(direction: -1 | 1): void;
|
|
9162
|
+
protected goToday(): void;
|
|
9163
|
+
protected dowLabel(dateStr: string): string;
|
|
9164
|
+
protected agendaDow(dateStr: string): string;
|
|
9165
|
+
protected agendaDate(dateStr: string): string;
|
|
9166
|
+
protected chipTime(e: CalendarItem): string;
|
|
9167
|
+
protected timeRange(e: CalendarItem): string;
|
|
9168
|
+
/** The button's name includes the visible time (WCAG 2.5.3 label in name) unless the host set `ariaLabel`. */
|
|
9169
|
+
protected itemLabel(e: CalendarItem): string;
|
|
9170
|
+
protected agendaMeta(e: CalendarItem): string[];
|
|
9171
|
+
private dayAriaLabel;
|
|
9172
|
+
protected onDateClick(dateStr: string): void;
|
|
9173
|
+
/** Grid keys on a day cell: arrows / Home / End move the tab stop, Enter / Space create. Keys on the chips inside never reach here. */
|
|
9174
|
+
protected onCellKey(event: KeyboardEvent, dateStr: string): void;
|
|
9175
|
+
/** The hidden "+ Add" button of an all-day cell (keyboard / screen-reader path to the same action as clicking the cell). */
|
|
9176
|
+
protected onAddAllDay(dateStr: string, event: Event): void;
|
|
9177
|
+
/** The hidden "+ Add" button of a day column: creates at the first visible hour. */
|
|
9178
|
+
protected onAddTimed(dateStr: string, event: Event): void;
|
|
9179
|
+
protected onSlotClick(dateStr: string, event: MouseEvent): void;
|
|
9180
|
+
protected onItemClick(item: CalendarItem, event: Event): void;
|
|
9181
|
+
protected onMoreClick(dateStr: string, items: CalendarItem[], event: Event): void;
|
|
9182
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CalendarComponent, never>;
|
|
9183
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<CalendarComponent, "ui-calendar", never, {
|
|
9184
|
+
"items": {
|
|
9185
|
+
"alias": "items";
|
|
9186
|
+
"required": false;
|
|
9187
|
+
"isSignal": true;
|
|
9188
|
+
};
|
|
9189
|
+
"loading": {
|
|
9190
|
+
"alias": "loading";
|
|
9191
|
+
"required": false;
|
|
9192
|
+
"isSignal": true;
|
|
9193
|
+
};
|
|
9194
|
+
"view": {
|
|
9195
|
+
"alias": "view";
|
|
9196
|
+
"required": false;
|
|
9197
|
+
"isSignal": true;
|
|
9198
|
+
};
|
|
9199
|
+
"views": {
|
|
9200
|
+
"alias": "views";
|
|
9201
|
+
"required": false;
|
|
9202
|
+
"isSignal": true;
|
|
9203
|
+
};
|
|
9204
|
+
"anchorDate": {
|
|
9205
|
+
"alias": "anchorDate";
|
|
9206
|
+
"required": false;
|
|
9207
|
+
"isSignal": true;
|
|
9208
|
+
};
|
|
9209
|
+
"filters": {
|
|
9210
|
+
"alias": "filters";
|
|
9211
|
+
"required": false;
|
|
9212
|
+
"isSignal": true;
|
|
9213
|
+
};
|
|
9214
|
+
"filterLabel": {
|
|
9215
|
+
"alias": "filterLabel";
|
|
9216
|
+
"required": false;
|
|
9217
|
+
"isSignal": true;
|
|
9218
|
+
};
|
|
9219
|
+
"filterMode": {
|
|
9220
|
+
"alias": "filterMode";
|
|
9221
|
+
"required": false;
|
|
9222
|
+
"isSignal": true;
|
|
9223
|
+
};
|
|
9224
|
+
"activeFilters": {
|
|
9225
|
+
"alias": "activeFilters";
|
|
9226
|
+
"required": false;
|
|
9227
|
+
"isSignal": true;
|
|
9228
|
+
};
|
|
9229
|
+
"showFilterCounts": {
|
|
9230
|
+
"alias": "showFilterCounts";
|
|
9231
|
+
"required": false;
|
|
9232
|
+
"isSignal": true;
|
|
9233
|
+
};
|
|
9234
|
+
"canCreate": {
|
|
9235
|
+
"alias": "canCreate";
|
|
9236
|
+
"required": false;
|
|
9237
|
+
"isSignal": true;
|
|
9238
|
+
};
|
|
9239
|
+
"disablePast": {
|
|
9240
|
+
"alias": "disablePast";
|
|
9241
|
+
"required": false;
|
|
9242
|
+
"isSignal": true;
|
|
9243
|
+
};
|
|
9244
|
+
"maxVisible": {
|
|
9245
|
+
"alias": "maxVisible";
|
|
9246
|
+
"required": false;
|
|
9247
|
+
"isSignal": true;
|
|
9248
|
+
};
|
|
9249
|
+
"chipLayout": {
|
|
9250
|
+
"alias": "chipLayout";
|
|
9251
|
+
"required": false;
|
|
9252
|
+
"isSignal": true;
|
|
9253
|
+
};
|
|
9254
|
+
"sortByTime": {
|
|
9255
|
+
"alias": "sortByTime";
|
|
9256
|
+
"required": false;
|
|
9257
|
+
"isSignal": true;
|
|
9258
|
+
};
|
|
9259
|
+
"startHour": {
|
|
9260
|
+
"alias": "startHour";
|
|
9261
|
+
"required": false;
|
|
9262
|
+
"isSignal": true;
|
|
9263
|
+
};
|
|
9264
|
+
"endHour": {
|
|
9265
|
+
"alias": "endHour";
|
|
9266
|
+
"required": false;
|
|
9267
|
+
"isSignal": true;
|
|
9268
|
+
};
|
|
9269
|
+
"emptyMessage": {
|
|
9270
|
+
"alias": "emptyMessage";
|
|
9271
|
+
"required": false;
|
|
9272
|
+
"isSignal": true;
|
|
9273
|
+
};
|
|
9274
|
+
"dayLabelFn": {
|
|
9275
|
+
"alias": "dayLabelFn";
|
|
9276
|
+
"required": false;
|
|
9277
|
+
"isSignal": true;
|
|
9278
|
+
};
|
|
9279
|
+
}, {
|
|
9280
|
+
"view": "viewChange";
|
|
9281
|
+
"anchorDate": "anchorDateChange";
|
|
9282
|
+
"activeFilters": "activeFiltersChange";
|
|
9283
|
+
"rangeChange": "rangeChange";
|
|
9284
|
+
"itemClick": "itemClick";
|
|
9285
|
+
"dateClick": "dateClick";
|
|
9286
|
+
"slotClick": "slotClick";
|
|
9287
|
+
"moreClick": "moreClick";
|
|
9288
|
+
}, never, ["[calendar-summary]", "[calendar-actions]", "[calendar-summary-mobile]"], true, never>;
|
|
9289
|
+
}
|
|
9290
|
+
export type { CalendarDay, CalendarRange, CalendarViewMode };
|