@forgeroute/ui 0.4.67 → 0.4.69
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// Independent column scrolling for detail pages (`<ui-sidebar-layout uiFillViewport>`): the viewport does not scroll; the two columns are capped
|
|
2
|
+
// to the room under the page's top block (`--cols-h`, set by the `uiFillViewport` directive) and each scrolls inside its own box.
|
|
3
|
+
//
|
|
4
|
+
// @use 'detail-columns' as dc; // @forgeroute/ui/src is on the stylePreprocessorOptions includePaths
|
|
5
|
+
// @include dc.independent-columns; // or (1200px) for collapseAt="lg"
|
|
6
|
+
//
|
|
7
|
+
// Markup: `.detail-page` wraps the page, `.col-main` is the `layout-main` element, `.col-side` is the `layout-side` element.
|
|
8
|
+
// Only applies while the layout has two columns: `$collapse` = the sidebar-layout `collapseAt` width in px (900 = md, 1200 = lg); collapsed it is
|
|
9
|
+
// one column and the page scrolls as usual. `$bleed` is the room inside the main column's scroll box so a focus ring or shadow at its edge is not clipped.
|
|
10
|
+
@mixin independent-columns($collapse: 900px, $bleed: 4px) {
|
|
11
|
+
@media (min-width: #{$collapse + 1}) {
|
|
12
|
+
.detail-page { padding-bottom: 0; } // the columns end at the bottom of the content area
|
|
13
|
+
.col-main {
|
|
14
|
+
position: relative; // visually hidden / absolutely positioned content (sr-only text, menus) stays inside this scroll box; otherwise it is positioned against the page and stretches the document, which then scrolls
|
|
15
|
+
box-sizing: border-box;
|
|
16
|
+
padding: $bleed;
|
|
17
|
+
margin: -$bleed;
|
|
18
|
+
max-height: calc(var(--cols-h) + #{2 * $bleed});
|
|
19
|
+
overflow-y: auto;
|
|
20
|
+
overscroll-behavior: contain;
|
|
21
|
+
-webkit-overflow-scrolling: touch;
|
|
22
|
+
}
|
|
23
|
+
.col-side {
|
|
24
|
+
display: block;
|
|
25
|
+
position: relative; // absolutely positioned content (visually hidden text, menus) stays inside this scroll box; otherwise it would stretch the library's outer side wrapper and give the column a second scrollbar
|
|
26
|
+
max-height: var(--cols-h);
|
|
27
|
+
overflow-y: auto;
|
|
28
|
+
overscroll-behavior: contain;
|
|
29
|
+
-webkit-overflow-scrolling: touch;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -115,7 +115,7 @@ export declare class TemplatePickerComponent {
|
|
|
115
115
|
private readonly host;
|
|
116
116
|
private readonly search$;
|
|
117
117
|
/** Filter results to a specific channel: 'email', 'text', or omit for all. */
|
|
118
|
-
readonly channel: import("@angular/core").InputSignal<"" | "
|
|
118
|
+
readonly channel: import("@angular/core").InputSignal<"" | "text" | "email">;
|
|
119
119
|
readonly selectedId: import("@angular/core").InputSignal<string | null>;
|
|
120
120
|
readonly label: import("@angular/core").InputSignal<string>;
|
|
121
121
|
/** Shows the red required asterisk (same as the library inputs) — e.g. when a template must be picked to send. */
|
|
@@ -543,7 +543,7 @@ export declare class DocumentSendOptionsComponent implements UiFieldValidity {
|
|
|
543
543
|
/** API root from FORGEROUTE_CONFIG (e.g. a cross-origin prod API); falls back to same-origin `/api`. */
|
|
544
544
|
private readonly apiBase;
|
|
545
545
|
/** `email` → purpose select + attachment allowed; `text` → link only (purpose fixed to e-signature). */
|
|
546
|
-
readonly channel: import("@angular/core").InputSignal<"
|
|
546
|
+
readonly channel: import("@angular/core").InputSignal<"text" | "email">;
|
|
547
547
|
readonly label: import("@angular/core").InputSignal<string>;
|
|
548
548
|
/** When true, at least one document must be chosen. The message forms leave it false: documents are optional there. */
|
|
549
549
|
readonly required: import("@angular/core").InputSignal<boolean>;
|
|
@@ -608,7 +608,7 @@ export declare class DocumentSendOptionsComponent implements UiFieldValidity {
|
|
|
608
608
|
/** Roles of documents whose row had no `signerRoles` and that the host resolves (`signers().resolveRoles`). */
|
|
609
609
|
readonly roleStates: import("@angular/core").WritableSignal<Record<string, RoleState>>;
|
|
610
610
|
/** The envelope's documents: `loading` / `error` while the panel reads them (`loadDocuments`), `ready` once known. */
|
|
611
|
-
readonly envelopeStatus: import("@angular/core").WritableSignal<"
|
|
611
|
+
readonly envelopeStatus: import("@angular/core").WritableSignal<"error" | "loading" | "ready" | "idle">;
|
|
612
612
|
private envelopeSub;
|
|
613
613
|
private readonly roleSubs;
|
|
614
614
|
/** The sender opened the collapsed "Signing options" line. */
|
|
@@ -1997,7 +1997,7 @@ export declare class SendMessagePanelComponent {
|
|
|
1997
1997
|
readonly activeContact: import("@angular/core").WritableSignal<MessageContact | null>;
|
|
1998
1998
|
/** What the sender should know about the picked contact before sending (why a channel is missing, what to add). */
|
|
1999
1999
|
readonly contactNotices: import("@angular/core").Signal<string[]>;
|
|
2000
|
-
readonly channel: import("@angular/core").WritableSignal<"
|
|
2000
|
+
readonly channel: import("@angular/core").WritableSignal<"text" | "email">;
|
|
2001
2001
|
readonly valid: import("@angular/core").WritableSignal<boolean>;
|
|
2002
2002
|
/** Bumped on every fresh open / new contact — re-creates the email and text forms so no draft carries over. */
|
|
2003
2003
|
readonly formEpoch: import("@angular/core").WritableSignal<number>;
|
|
@@ -1300,7 +1300,7 @@ export declare class StripeConnectComponent {
|
|
|
1300
1300
|
readonly navigateTab: import("@angular/core").InputSignal<((url: string) => void) | null>;
|
|
1301
1301
|
protected readonly visible: import("@angular/core").Signal<boolean>;
|
|
1302
1302
|
/** Which screen the card shows. */
|
|
1303
|
-
protected readonly state: import("@angular/core").Signal<"
|
|
1303
|
+
protected readonly state: import("@angular/core").Signal<"complete" | "verifying" | "incomplete" | "none">;
|
|
1304
1304
|
/** What the persistent status region says: the current state, plus "Loading." while a request runs. Empty while nothing is shown. */
|
|
1305
1305
|
protected readonly liveText: import("@angular/core").Signal<string>;
|
|
1306
1306
|
/** The user pressed a button that started a request: when the screen then changes, focus moves to the new screen (the pressed button is gone). */
|
package/types/forgeroute-ui.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import * as i0 from "@angular/core";
|
|
|
2
2
|
import { EnvironmentProviders, InjectionToken, OnDestroy, OnInit, Signal, TemplateRef, WritableSignal } from "@angular/core";
|
|
3
3
|
import { UrlTree } from "@angular/router";
|
|
4
4
|
import { Observable } from "rxjs";
|
|
5
|
-
import { AbstractControl, ControlValueAccessor, FormControl, ValidationErrors, Validator } from "@angular/forms";
|
|
5
|
+
import { AbstractControl, ControlValueAccessor, FormControl, ValidationErrors, Validator, ValidatorFn } from "@angular/forms";
|
|
6
6
|
import { HttpInterceptorFn } from "@angular/common/http";
|
|
7
7
|
import { SafeHtml } from "@angular/platform-browser";
|
|
8
8
|
export interface ForgerouteConfig {
|
|
@@ -1095,7 +1095,7 @@ export declare class SelectComponent implements ControlValueAccessor, Validator,
|
|
|
1095
1095
|
readonly error: import("@angular/core").InputSignal<string>;
|
|
1096
1096
|
/** Reveal the built-in error messages now (e.g. after a failed Save click), without waiting for blur. */
|
|
1097
1097
|
readonly showErrors: import("@angular/core").InputSignal<boolean>;
|
|
1098
|
-
readonly size: import("@angular/core").InputSignal<"
|
|
1098
|
+
readonly size: import("@angular/core").InputSignal<"default" | "sm">;
|
|
1099
1099
|
readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
|
|
1100
1100
|
private readonly _cvaDisabled;
|
|
1101
1101
|
protected readonly disabled: import("@angular/core").Signal<boolean>;
|
|
@@ -1591,6 +1591,8 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
|
|
|
1591
1591
|
*/
|
|
1592
1592
|
private _columnBadgeLabel;
|
|
1593
1593
|
protected readonly _error: import("@angular/core").WritableSignal<string | null>;
|
|
1594
|
+
/** Phone card list is only a role=list while it contains listitems: skeleton cards or real rows (not error / empty / no-match). */
|
|
1595
|
+
protected readonly _cardListHasItems: Signal<boolean>;
|
|
1594
1596
|
private readonly _loadFailed;
|
|
1595
1597
|
/**
|
|
1596
1598
|
* True from a failed load (the table shows its error state) until a later load SUCCEEDS. Unlike the error state itself it stays true while
|
|
@@ -2405,6 +2407,8 @@ export declare class ToastService implements OnDestroy {
|
|
|
2405
2407
|
private _remaining;
|
|
2406
2408
|
private _paused;
|
|
2407
2409
|
show(msg: string, duration?: number): void;
|
|
2410
|
+
/** Green success toast, the explicit name for `show()` (same type, same 3000ms default, same behaviour). */
|
|
2411
|
+
success(msg: string, duration?: number): void;
|
|
2408
2412
|
/** Neutral (blue) toast for a result that is neither a success nor a failure, e.g. "No changes to save.". */
|
|
2409
2413
|
info(msg: string, duration?: number): void;
|
|
2410
2414
|
error(msg: string, duration?: number): void;
|
|
@@ -2682,7 +2686,7 @@ export declare class AudioPlayerComponent {
|
|
|
2682
2686
|
/** Accessible name of the player. */
|
|
2683
2687
|
readonly ariaLabel: import("@angular/core").InputSignal<string>;
|
|
2684
2688
|
/** How much to load before play: 'metadata' (default), 'auto' or 'none'. */
|
|
2685
|
-
readonly preload: import("@angular/core").InputSignal<"none" | "
|
|
2689
|
+
readonly preload: import("@angular/core").InputSignal<"none" | "auto" | "metadata">;
|
|
2686
2690
|
/** Fires when the browser can't load or decode the source. */
|
|
2687
2691
|
readonly playbackError: import("@angular/core").OutputEmitterRef<void>;
|
|
2688
2692
|
protected readonly failed: import("@angular/core").WritableSignal<boolean>;
|
|
@@ -2936,7 +2940,7 @@ export declare class CheckboxComponent implements ControlValueAccessor, Validato
|
|
|
2936
2940
|
* clicking it still toggles the box - e.g. a product name that is both the heading of its card and the label of its checkbox.
|
|
2937
2941
|
* Default null: plain label text, exactly as before. Single mode only.
|
|
2938
2942
|
*/
|
|
2939
|
-
readonly headingLevel: import("@angular/core").InputSignal<1 | 2 |
|
|
2943
|
+
readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 3 | 4 | 5 | 6 | null>;
|
|
2940
2944
|
readonly indeterminate: import("@angular/core").InputSignal<boolean>;
|
|
2941
2945
|
readonly checked: import("@angular/core").ModelSignal<boolean>;
|
|
2942
2946
|
/**
|
|
@@ -3963,7 +3967,7 @@ export declare class ButtonComponent {
|
|
|
3963
3967
|
* `ghost-start`: a ghost button for list / section toggles - a full-width row with its content aligned to the start, transparent
|
|
3964
3968
|
* background, hover tint and the normal focus ring. Pair it with `ariaExpanded` / `ariaPressed`; the label may contain a heading element.
|
|
3965
3969
|
*/
|
|
3966
|
-
readonly variant: import("@angular/core").InputSignal<"
|
|
3970
|
+
readonly variant: import("@angular/core").InputSignal<"primary" | "secondary" | "danger" | "warning" | "link" | "ghost" | "ghost-start" | "tab" | "icon" | "icon-danger">;
|
|
3967
3971
|
/** 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`). */
|
|
3968
3972
|
readonly routerLink: import("@angular/core").InputSignal<string | readonly unknown[] | null>;
|
|
3969
3973
|
/** Query params of the `routerLink` (e.g. `{ section: 'deal-defaults' }`). */
|
|
@@ -4009,7 +4013,7 @@ export declare class ButtonComponent {
|
|
|
4009
4013
|
readonly color: import("@angular/core").InputSignal<string | undefined>;
|
|
4010
4014
|
readonly active: import("@angular/core").InputSignal<boolean>;
|
|
4011
4015
|
readonly size: import("@angular/core").InputSignal<"sm" | "md" | "lg" | "xs">;
|
|
4012
|
-
readonly type: import("@angular/core").InputSignal<"
|
|
4016
|
+
readonly type: import("@angular/core").InputSignal<"reset" | "submit" | "button">;
|
|
4013
4017
|
readonly disabled: import("@angular/core").InputSignal<boolean>;
|
|
4014
4018
|
readonly loading: import("@angular/core").InputSignal<boolean>;
|
|
4015
4019
|
readonly fullWidth: import("@angular/core").InputSignal<boolean>;
|
|
@@ -4281,9 +4285,9 @@ export interface ContactLookup {
|
|
|
4281
4285
|
email: string | null;
|
|
4282
4286
|
smsOptedIn: boolean;
|
|
4283
4287
|
}
|
|
4284
|
-
declare function formatPhone(raw: string | null | undefined): string;
|
|
4288
|
+
declare function formatPhone$1(raw: string | null | undefined): string;
|
|
4285
4289
|
export declare class ContactPickerComponent {
|
|
4286
|
-
readonly formatPhone: typeof formatPhone;
|
|
4290
|
+
readonly formatPhone: typeof formatPhone$1;
|
|
4287
4291
|
readonly label: import("@angular/core").InputSignal<string>;
|
|
4288
4292
|
readonly placeholder: import("@angular/core").InputSignal<string>;
|
|
4289
4293
|
/** Helper text under the picker (linked to the search input via aria-describedby). */
|
|
@@ -4948,7 +4952,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
|
|
|
4948
4952
|
readonly passwordRequirements: import("@angular/core").InputSignal<boolean>;
|
|
4949
4953
|
/** Rules for `passwordRequirements`; default = the library's five rules (8+ characters, upper, lower, digit, special). */
|
|
4950
4954
|
readonly passwordRules: import("@angular/core").InputSignal<readonly PasswordRule[] | undefined>;
|
|
4951
|
-
readonly type: import("@angular/core").InputSignal<"number" | "text" | "
|
|
4955
|
+
readonly type: import("@angular/core").InputSignal<"number" | "text" | "email" | "tel" | "password" | "url">;
|
|
4952
4956
|
readonly maxlength: import("@angular/core").InputSignal<number | undefined>;
|
|
4953
4957
|
readonly required: import("@angular/core").InputSignal<boolean>;
|
|
4954
4958
|
readonly autocomplete: import("@angular/core").InputSignal<string>;
|
|
@@ -4957,7 +4961,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
|
|
|
4957
4961
|
* `search`, `text`, `none`). Empty (default) = the browser's default for the field, except `type="tel"`, which keeps `tel`.
|
|
4958
4962
|
* It only picks the keyboard; it does not restrict what can be typed or pasted.
|
|
4959
4963
|
*/
|
|
4960
|
-
readonly inputmode: import("@angular/core").InputSignal<"" | "none" | "text" | "search" | "
|
|
4964
|
+
readonly inputmode: import("@angular/core").InputSignal<"" | "none" | "text" | "search" | "email" | "tel" | "url" | "decimal" | "numeric">;
|
|
4961
4965
|
readonly readonly: import("@angular/core").InputSignal<boolean>;
|
|
4962
4966
|
readonly hint: import("@angular/core").InputSignal<string>;
|
|
4963
4967
|
/** Id(s) of an external element that also describes this control (e.g. one shared error text for a group of fields). Space separated; MERGED after the control's own hint / error id in `aria-describedby`, never replacing it. Empty = unchanged. */
|
|
@@ -5023,7 +5027,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
|
|
|
5023
5027
|
protected readonly _stepAttr: import("@angular/core").Signal<string | null>;
|
|
5024
5028
|
protected readonly _revealable: import("@angular/core").Signal<boolean>;
|
|
5025
5029
|
protected readonly _shown: import("@angular/core").WritableSignal<boolean>;
|
|
5026
|
-
protected readonly _inputType: import("@angular/core").Signal<"number" | "text" | "
|
|
5030
|
+
protected readonly _inputType: import("@angular/core").Signal<"number" | "text" | "email" | "tel" | "password" | "url">;
|
|
5027
5031
|
protected readonly _eyePath: string;
|
|
5028
5032
|
protected readonly _eyeOffPath: string;
|
|
5029
5033
|
protected readonly _showRequirements: import("@angular/core").Signal<boolean>;
|
|
@@ -5214,6 +5218,26 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
|
|
|
5214
5218
|
"invalidChange": "invalidChange";
|
|
5215
5219
|
}, never, ["[uiLabelEnd]"], true, never>;
|
|
5216
5220
|
}
|
|
5221
|
+
/** Longest password the apps' servers accept (128 characters); use it as the password input's `maxlength`. */
|
|
5222
|
+
export declare const PASSWORD_MAX_LENGTH = 128;
|
|
5223
|
+
/**
|
|
5224
|
+
* Policy of servers that accept only these special characters: 8+ characters, an uppercase letter, a lowercase letter, a digit and one of
|
|
5225
|
+
* `@ $ ! % * ? & #`. (Anything else, e.g. `^` or a space, does NOT count as the special character.)
|
|
5226
|
+
*/
|
|
5227
|
+
export declare const LISTED_SPECIAL_PASSWORD_RULES: readonly PasswordRule[];
|
|
5228
|
+
/**
|
|
5229
|
+
* Policy of servers that accept any ASCII symbol as the special character (character codes 33-126 that are not letters or digits): 8+ characters,
|
|
5230
|
+
* an uppercase letter, a lowercase letter, a digit and one ASCII symbol. A space and non-ASCII characters (e.g. `é`) do NOT count.
|
|
5231
|
+
*/
|
|
5232
|
+
export declare const ASCII_SPECIAL_PASSWORD_RULES: readonly PasswordRule[];
|
|
5233
|
+
/**
|
|
5234
|
+
* A form validator for a sign-up / reset-password control: the value must satisfy every rule and be at most `maxLength` characters. The error key
|
|
5235
|
+
* is `passwordRules` (value `true`). A null / undefined value counts as an empty string (so it fails the rules; combine with `Validators.required`
|
|
5236
|
+
* when an empty field should show a different message).
|
|
5237
|
+
*
|
|
5238
|
+
* password = new FormControl('', [createPasswordPolicyValidator(LISTED_SPECIAL_PASSWORD_RULES)]);
|
|
5239
|
+
*/
|
|
5240
|
+
export declare function createPasswordPolicyValidator(rules: readonly PasswordRule[], maxLength?: number): ValidatorFn;
|
|
5217
5241
|
/**
|
|
5218
5242
|
* Number pad for short numeric codes such as a PIN. Shows one dot per allowed digit (filled as digits are entered) above a 3x4 grid of
|
|
5219
5243
|
* 44px+ touch targets. The value is the digit string (`''` = nothing entered); it works with `[(value)]` and with `ngModel` / `FormControl`.
|
|
@@ -6823,7 +6847,7 @@ export declare class FormRowComponent {
|
|
|
6823
6847
|
* child simply takes the full width. Keep a numeric span within the row's `cols` (use `all` for the whole row).
|
|
6824
6848
|
*/
|
|
6825
6849
|
export declare class FormColSpanDirective {
|
|
6826
|
-
readonly uiColSpan: import("@angular/core").InputSignal<"" | 2 | 3 |
|
|
6850
|
+
readonly uiColSpan: import("@angular/core").InputSignal<"" | "2" | "3" | 2 | 3 | "all">;
|
|
6827
6851
|
protected readonly _class: import("@angular/core").Signal<string>;
|
|
6828
6852
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormColSpanDirective, never>;
|
|
6829
6853
|
static ɵdir: i0.ɵɵDirectiveDeclaration<FormColSpanDirective, "[uiColSpan]", never, {
|
|
@@ -8046,6 +8070,39 @@ export interface UsStateOption {
|
|
|
8046
8070
|
label: string;
|
|
8047
8071
|
}
|
|
8048
8072
|
export declare const US_STATES: UsStateOption[];
|
|
8073
|
+
/**
|
|
8074
|
+
* The 50 US states (no DC) with their major cities, keyed by two-letter state code: `US_LOCATIONS['TX']` -> `['Abilene', ...]`. Cities are unique and
|
|
8075
|
+
* trimmed per state. Use it for a city picker that follows a state select (the state names are in `US_STATES`).
|
|
8076
|
+
*/
|
|
8077
|
+
export declare const US_LOCATIONS: Record<string, string[]>;
|
|
8078
|
+
/**
|
|
8079
|
+
* Look of the record-card groups on detail pages (the section header's title, icon and tint), so groups that exist in several apps look identical.
|
|
8080
|
+
* Icon names are from the library's icon list; `background` is the section header's own light tint.
|
|
8081
|
+
*
|
|
8082
|
+
* const GROUPS = { ...COMMON_DETAIL_GROUP_STYLES, deals: { title: 'Deals & Money', icon: 'opportunity', background: '#ecfdf5' } };
|
|
8083
|
+
*/
|
|
8084
|
+
export interface DetailGroupStyle {
|
|
8085
|
+
title: string;
|
|
8086
|
+
icon: string;
|
|
8087
|
+
background: string;
|
|
8088
|
+
}
|
|
8089
|
+
/** The groups every app's detail pages share (the same title, icon and tint everywhere). An app adds its own groups next to these. */
|
|
8090
|
+
export declare const COMMON_DETAIL_GROUP_STYLES: {
|
|
8091
|
+
readonly activity: {
|
|
8092
|
+
readonly title: "Activity";
|
|
8093
|
+
readonly icon: "message";
|
|
8094
|
+
readonly background: "#eff6ff";
|
|
8095
|
+
};
|
|
8096
|
+
readonly notes: {
|
|
8097
|
+
readonly title: "Notes";
|
|
8098
|
+
readonly icon: "add-note";
|
|
8099
|
+
readonly background: "#f1f5f9";
|
|
8100
|
+
};
|
|
8101
|
+
};
|
|
8102
|
+
/** Header background of every record card on the detail pages (bound as the library card's `headerBackground`). */
|
|
8103
|
+
export declare const DETAIL_CARD_HEADER_BG = "#f8fafc";
|
|
8104
|
+
/** Light blue behind every group section header on the detail pages (large header with an icon tile and a description). */
|
|
8105
|
+
export declare const DETAIL_GROUP_HEADER_BG = "#eaf3ff";
|
|
8049
8106
|
export interface NavLink {
|
|
8050
8107
|
label: string;
|
|
8051
8108
|
route: string;
|
|
@@ -8086,6 +8143,11 @@ export declare class AppShellComponent implements OnInit, OnDestroy {
|
|
|
8086
8143
|
* when the title is not set.
|
|
8087
8144
|
*/
|
|
8088
8145
|
readonly pageTitle: import("@angular/core").InputSignal<string>;
|
|
8146
|
+
/**
|
|
8147
|
+
* Show the app's toasts (renders one `<ui-toast />` for the whole shell). Default false so an app that already renders its own `<ui-toast />`
|
|
8148
|
+
* is unchanged; an app that sets this removes its own.
|
|
8149
|
+
*/
|
|
8150
|
+
readonly showToast: import("@angular/core").InputSignal<boolean>;
|
|
8089
8151
|
readonly appName: import("@angular/core").InputSignal<string>;
|
|
8090
8152
|
readonly user: import("@angular/core").InputSignal<ShellUser | null>;
|
|
8091
8153
|
readonly readOnly: import("@angular/core").InputSignal<boolean>;
|
|
@@ -8103,6 +8165,10 @@ export declare class AppShellComponent implements OnInit, OnDestroy {
|
|
|
8103
8165
|
readonly persistKey: import("@angular/core").InputSignal<string>;
|
|
8104
8166
|
readonly logoutClick: import("@angular/core").OutputEmitterRef<void>;
|
|
8105
8167
|
protected readonly _sidebarOpen: import("@angular/core").WritableSignal<boolean>;
|
|
8168
|
+
/** `data.pageTitle` of the deepest activated route that sets one ('' when none does). Updated on every NavigationEnd. */
|
|
8169
|
+
protected readonly _routeTitle: import("@angular/core").WritableSignal<string>;
|
|
8170
|
+
/** The title shown in the top bar: the `pageTitle` input when the app sets one (it wins), else the route's `data.pageTitle`. */
|
|
8171
|
+
protected readonly _title: import("@angular/core").Signal<string>;
|
|
8106
8172
|
protected readonly _collapsed: import("@angular/core").WritableSignal<boolean>;
|
|
8107
8173
|
/** The rail (icons-only sidebar) only exists on the desktop layout; on the drawer layout (≤1024px) a saved rail choice is ignored. */
|
|
8108
8174
|
protected readonly _drawerLayout: import("@angular/core").WritableSignal<boolean>;
|
|
@@ -8144,6 +8210,8 @@ export declare class AppShellComponent implements OnInit, OnDestroy {
|
|
|
8144
8210
|
ngOnInit(): void;
|
|
8145
8211
|
private _drawerMq?;
|
|
8146
8212
|
private readonly _onDrawerMqChange;
|
|
8213
|
+
/** The `data.pageTitle` of the deepest activated route that has a non-empty string one (a child route's title wins over its parent's). */
|
|
8214
|
+
private _titleOfRoute;
|
|
8147
8215
|
ngOnDestroy(): void;
|
|
8148
8216
|
private _expandActiveGroup;
|
|
8149
8217
|
static ɵfac: i0.ɵɵFactoryDeclaration<AppShellComponent, never>;
|
|
@@ -8158,6 +8226,11 @@ export declare class AppShellComponent implements OnInit, OnDestroy {
|
|
|
8158
8226
|
"required": false;
|
|
8159
8227
|
"isSignal": true;
|
|
8160
8228
|
};
|
|
8229
|
+
"showToast": {
|
|
8230
|
+
"alias": "showToast";
|
|
8231
|
+
"required": false;
|
|
8232
|
+
"isSignal": true;
|
|
8233
|
+
};
|
|
8161
8234
|
"appName": {
|
|
8162
8235
|
"alias": "appName";
|
|
8163
8236
|
"required": false;
|
|
@@ -9913,7 +9986,7 @@ export declare class DetailCardComponent {
|
|
|
9913
9986
|
/** true (default) = the title is displayed in capitals (CSS only); false = shown as written. The text, aria-label and heading name are never changed. */
|
|
9914
9987
|
readonly uppercaseTitle: import("@angular/core").InputSignal<boolean>;
|
|
9915
9988
|
/** 1-6 makes the title a real heading for screen readers (role=heading, aria-level); null keeps it plain text. */
|
|
9916
|
-
readonly headingLevel: import("@angular/core").InputSignal<1 | 2 |
|
|
9989
|
+
readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 3 | 4 | 5 | 6 | null>;
|
|
9917
9990
|
/** Optional id for the title text; the card is then labelled by it. Without it the title is the card's aria-label. */
|
|
9918
9991
|
readonly titleId: import("@angular/core").InputSignal<string>;
|
|
9919
9992
|
/** Accessible name of the card when the header gives none (no header, or no title). A visible title wins; blank = no name. */
|
|
@@ -11197,6 +11270,28 @@ export declare class SidebarLayoutComponent {
|
|
|
11197
11270
|
};
|
|
11198
11271
|
}, {}, never, ["[layout-main]", "[layout-side]"], true, never>;
|
|
11199
11272
|
}
|
|
11273
|
+
/**
|
|
11274
|
+
* Independent column scrolling for a detail page's `<ui-sidebar-layout uiFillViewport>`.
|
|
11275
|
+
*
|
|
11276
|
+
* Sets `--cols-h` on the host: the room left between the top of the layout and the bottom of the shell's content area (the nearest
|
|
11277
|
+
* `<main>`). Pair it with the `independent-columns` mixin (`@use 'detail-columns' as dc;` from `@forgeroute/ui/src/_detail-columns.scss`),
|
|
11278
|
+
* which caps both columns to `--cols-h` so each scrolls on its own while the viewport does not scroll.
|
|
11279
|
+
*
|
|
11280
|
+
* <ui-sidebar-layout uiFillViewport sideWidth="320px" collapseAt="md">
|
|
11281
|
+
* <div layout-main class="col-main"> ... </div>
|
|
11282
|
+
* <aside layout-side class="col-side"> ... </aside>
|
|
11283
|
+
* </ui-sidebar-layout>
|
|
11284
|
+
*
|
|
11285
|
+
* Re-measured when the content area or the element's parent changes size (window resize, tabs wrapping, a card loading). Pure layout maths
|
|
11286
|
+
* on the element's position inside the scroller's content, so it does not depend on how far the page happens to be scrolled. The height is
|
|
11287
|
+
* never below 240px. With no `<main>` ancestor nothing is set. Not related to `ui-page`'s `fillViewport` input (a page at least one viewport high).
|
|
11288
|
+
*/
|
|
11289
|
+
export declare class FillViewportDirective {
|
|
11290
|
+
private readonly el;
|
|
11291
|
+
constructor();
|
|
11292
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<FillViewportDirective, never>;
|
|
11293
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<FillViewportDirective, "[uiFillViewport]", never, {}, {}, never, never, true, never>;
|
|
11294
|
+
}
|
|
11200
11295
|
export type ActionBarAlign = 'start' | 'center' | 'end' | 'between';
|
|
11201
11296
|
/**
|
|
11202
11297
|
* Bar for page-level actions (Save / Cancel) that stays at the bottom of the scrolling area.
|
|
@@ -11334,6 +11429,26 @@ declare function layoutLanes(boxes: {
|
|
|
11334
11429
|
top: number;
|
|
11335
11430
|
height: number;
|
|
11336
11431
|
}[]): Record<string, CalendarLane>;
|
|
11432
|
+
/** A heading shared by consecutive agenda days (`ui-calendar` `agendaGroupFn`). Days that return the same `key` one after another sit under one heading. */
|
|
11433
|
+
interface CalendarAgendaGroup {
|
|
11434
|
+
key: string;
|
|
11435
|
+
label: string;
|
|
11436
|
+
}
|
|
11437
|
+
/**
|
|
11438
|
+
* Ready-made `agendaGroupFn` for `ui-calendar`: Overdue (before `todayStr`), Today, Tomorrow, This Week (the rest of the current Sunday-first
|
|
11439
|
+
* week) and Later (everything after). Pure `YYYY-MM-DD` string math (a day is added with the local `Date(y, m, d + n)` constructor, so a daylight
|
|
11440
|
+
* saving change never shifts it); nothing parses a non-ISO string. A `todayStr` that is not a real day, or a day that is not a real
|
|
11441
|
+
* `YYYY-MM-DD`, gives `null` (no heading) instead of a wrong group.
|
|
11442
|
+
*
|
|
11443
|
+
* readonly group = computed(() => periodGroup(this.todayIso())); // <ui-calendar [agendaGroupFn]="group()" />
|
|
11444
|
+
*/
|
|
11445
|
+
export declare function periodGroup(todayStr: string): (dateStr: string) => CalendarAgendaGroup | null;
|
|
11446
|
+
/** Level of a day's decoration (`ui-calendar` `dayDecorationFn`), lowest to highest. */
|
|
11447
|
+
type CalendarDayLevel = 'low' | 'medium' | 'high' | 'critical';
|
|
11448
|
+
/** What a screen reader hears for a decorated day (added to the cell's label, and shown as hidden text in the week view header). */
|
|
11449
|
+
declare const DAY_LEVEL_TEXT: Record<CalendarDayLevel, string>;
|
|
11450
|
+
/** True for the four known levels (an unknown string from a loosely typed host is ignored, not drawn). */
|
|
11451
|
+
declare function isDayLevel(level: unknown): level is CalendarDayLevel;
|
|
11337
11452
|
/** One thing on the calendar. The host maps its own records to this shape. */
|
|
11338
11453
|
export interface CalendarItem {
|
|
11339
11454
|
/** Unique across ALL items passed in (prefix ids by source when merging lists, e.g. `task-…`, `event-…`). */
|
|
@@ -11388,6 +11503,29 @@ export interface CalendarSlotClick {
|
|
|
11388
11503
|
/** `HH:00` of the clicked hour row. */
|
|
11389
11504
|
time: string;
|
|
11390
11505
|
}
|
|
11506
|
+
/** What `dayDecorationFn` returns for one day: a tint level and/or a tooltip. */
|
|
11507
|
+
export interface CalendarDayDecoration {
|
|
11508
|
+
/** Tints the day (month cell background + a coloured top bar; week view day header) and adds "<level> activity" to its screen-reader label. */
|
|
11509
|
+
level?: CalendarDayLevel;
|
|
11510
|
+
/** Hover / keyboard-focus tooltip of the day (library `uiTooltip`). Empty = none. */
|
|
11511
|
+
tooltip?: string;
|
|
11512
|
+
}
|
|
11513
|
+
/** One quick action offered on an item (`itemActionsFn`). */
|
|
11514
|
+
export interface CalendarItemAction {
|
|
11515
|
+
/** Unique per item; reported back in `itemAction`. */
|
|
11516
|
+
id: string;
|
|
11517
|
+
/** Visible text (or the hover title and accessible name when `icon` is set). */
|
|
11518
|
+
label: string;
|
|
11519
|
+
/** Icon key of `<ui-icon>` (e.g. `check`, `edit`, `delete`). With an icon the button shows only the icon; without one it shows the label. */
|
|
11520
|
+
icon?: string;
|
|
11521
|
+
disabled?: boolean;
|
|
11522
|
+
/** `danger` draws it red (destructive actions). */
|
|
11523
|
+
variant?: 'default' | 'danger';
|
|
11524
|
+
}
|
|
11525
|
+
export interface CalendarItemActionEvent {
|
|
11526
|
+
item: CalendarItem;
|
|
11527
|
+
actionId: string;
|
|
11528
|
+
}
|
|
11391
11529
|
/**
|
|
11392
11530
|
* Month / week / agenda calendar. The host owns the data: it listens to `(rangeChange)`, loads that range and passes
|
|
11393
11531
|
* the result as `items`. The calendar owns navigation, the view switcher, type filters, layout and keyboard access.
|
|
@@ -11467,8 +11605,28 @@ export declare class CalendarComponent {
|
|
|
11467
11605
|
readonly startHour: import("@angular/core").InputSignal<number>;
|
|
11468
11606
|
readonly endHour: import("@angular/core").InputSignal<number>;
|
|
11469
11607
|
readonly emptyMessage: import("@angular/core").InputSignal<string>;
|
|
11470
|
-
/** Builds the screen-reader name of a month cell; default "<weekday, date>, N events". */
|
|
11608
|
+
/** Builds the screen-reader name of a month cell; default "<weekday, date>, N events" (plus ", <level> activity" when `dayDecorationFn` gives a level). */
|
|
11471
11609
|
readonly dayLabelFn: import("@angular/core").InputSignal<((dateStr: string, items: CalendarItem[]) => string) | null>;
|
|
11610
|
+
/**
|
|
11611
|
+
* Optional per-day decoration (e.g. a workload heat map): called for every visible day with its items after the active filters. A `level`
|
|
11612
|
+
* (`low` / `medium` / `high` / `critical`) tints the month cell (background + a coloured bar on top, so the level is not colour alone) and the
|
|
11613
|
+
* week view day header, and adds "<level> activity" to the cell's default screen-reader label (a custom `dayLabelFn` label is used as given)
|
|
11614
|
+
* and as hidden text in the week header. A `tooltip` shows on hover and keyboard focus (library `uiTooltip`). Null / `null` result = no change.
|
|
11615
|
+
*/
|
|
11616
|
+
readonly dayDecorationFn: import("@angular/core").InputSignal<((dateStr: string, items: CalendarItem[]) => CalendarDayDecoration | null) | null>;
|
|
11617
|
+
/**
|
|
11618
|
+
* Optional quick actions on items (e.g. Confirm / Complete): called once per item, return `[]` for none. The actions are real buttons next to the
|
|
11619
|
+
* item (month chip, all-day chip, timed event, agenda row) that appear on hover AND when keyboard focus is inside the item; they emit `itemAction`
|
|
11620
|
+
* and never `itemClick`. On touch screens the agenda view always shows them (month and week chips show them while tapped / focused). Escape inside the
|
|
11621
|
+
* actions returns focus to the item. Null = no actions and no extra DOM.
|
|
11622
|
+
*/
|
|
11623
|
+
readonly itemActionsFn: import("@angular/core").InputSignal<((item: CalendarItem) => CalendarItemAction[]) | null>;
|
|
11624
|
+
/**
|
|
11625
|
+
* Optional agenda headings: called with each agenda day; consecutive days that return the same `key` share one `<h3>` heading (a `<section>`
|
|
11626
|
+
* labelled by it). A `null` result draws that day without a heading. `periodGroup(today)` is a ready-made Overdue / Today / Tomorrow / This Week /
|
|
11627
|
+
* Later grouping. Null = one block per date, as before.
|
|
11628
|
+
*/
|
|
11629
|
+
readonly agendaGroupFn: import("@angular/core").InputSignal<((dateStr: string) => CalendarAgendaGroup | null) | null>;
|
|
11472
11630
|
/** Fires on first render and whenever the view or the visible range changes: load this range, then pass `items`. */
|
|
11473
11631
|
readonly rangeChange: import("@angular/core").OutputEmitterRef<CalendarRange>;
|
|
11474
11632
|
readonly itemClick: import("@angular/core").OutputEmitterRef<CalendarItem>;
|
|
@@ -11478,6 +11636,8 @@ export declare class CalendarComponent {
|
|
|
11478
11636
|
readonly slotClick: import("@angular/core").OutputEmitterRef<CalendarSlotClick>;
|
|
11479
11637
|
/** "+N more" clicked in a month cell. */
|
|
11480
11638
|
readonly moreClick: import("@angular/core").OutputEmitterRef<CalendarMoreClick>;
|
|
11639
|
+
/** A quick action of an item (`itemActionsFn`) was activated. Never accompanied by `itemClick`. */
|
|
11640
|
+
readonly itemAction: import("@angular/core").OutputEmitterRef<CalendarItemActionEvent>;
|
|
11481
11641
|
private readonly host;
|
|
11482
11642
|
protected readonly weekDayLabels: string[];
|
|
11483
11643
|
protected readonly weekDayNames: string[];
|
|
@@ -11526,6 +11686,8 @@ export declare class CalendarComponent {
|
|
|
11526
11686
|
overflow: number;
|
|
11527
11687
|
clickable: boolean;
|
|
11528
11688
|
label: string;
|
|
11689
|
+
level: CalendarDayLevel | null;
|
|
11690
|
+
tooltip: string;
|
|
11529
11691
|
}[];
|
|
11530
11692
|
}[]>;
|
|
11531
11693
|
/** The 7 week columns with all-day items and the timed items laid out side by side when they overlap. */
|
|
@@ -11533,6 +11695,8 @@ export declare class CalendarComponent {
|
|
|
11533
11695
|
day: import("@forgeroute/ui").CalendarDay;
|
|
11534
11696
|
label: string;
|
|
11535
11697
|
clickable: boolean;
|
|
11698
|
+
level: CalendarDayLevel | null;
|
|
11699
|
+
tooltip: string;
|
|
11536
11700
|
allDay: CalendarItem[];
|
|
11537
11701
|
timed: {
|
|
11538
11702
|
lane: CalendarLane;
|
|
@@ -11565,6 +11729,29 @@ export declare class CalendarComponent {
|
|
|
11565
11729
|
protected itemLabel(e: CalendarItem): string;
|
|
11566
11730
|
protected agendaMeta(e: CalendarItem): string[];
|
|
11567
11731
|
private dayAriaLabel;
|
|
11732
|
+
/** The decoration of one day: an unknown `level` (loosely typed host) is dropped, a missing tooltip is `''`. */
|
|
11733
|
+
private decoration;
|
|
11734
|
+
protected levelText(level: CalendarDayLevel): string;
|
|
11735
|
+
/** Quick actions per item id, computed once per input change (nothing is computed while `itemActionsFn` is null). */
|
|
11736
|
+
private readonly actionsById;
|
|
11737
|
+
private static readonly NO_ACTIONS;
|
|
11738
|
+
protected actionsFor(item: CalendarItem): CalendarItemAction[];
|
|
11739
|
+
protected actionIconD(a: CalendarItemAction): string | null;
|
|
11740
|
+
protected onActionClick(item: CalendarItem, action: CalendarItemAction, event: Event): void;
|
|
11741
|
+
/** Escape inside an item's actions: focus goes back to the item's own button. */
|
|
11742
|
+
protected onActionsEscape(event: Event): void;
|
|
11743
|
+
/** Agenda days grouped under `agendaGroupFn` headings (consecutive days with the same key), or null when no function is set. */
|
|
11744
|
+
private static nextUid;
|
|
11745
|
+
private readonly uid;
|
|
11746
|
+
protected readonly agendaSections: import("@angular/core").Signal<{
|
|
11747
|
+
key: string;
|
|
11748
|
+
label: string;
|
|
11749
|
+
id: string;
|
|
11750
|
+
groups: {
|
|
11751
|
+
dateStr: string;
|
|
11752
|
+
items: CalendarItem[];
|
|
11753
|
+
}[];
|
|
11754
|
+
}[] | null>;
|
|
11568
11755
|
protected onDateClick(dateStr: string): void;
|
|
11569
11756
|
/** Grid keys on a day cell: arrows / Home / End move the tab stop, Enter / Space create. Keys on the chips inside never reach here. */
|
|
11570
11757
|
protected onCellKey(event: KeyboardEvent, dateStr: string): void;
|
|
@@ -11684,6 +11871,21 @@ export declare class CalendarComponent {
|
|
|
11684
11871
|
"required": false;
|
|
11685
11872
|
"isSignal": true;
|
|
11686
11873
|
};
|
|
11874
|
+
"dayDecorationFn": {
|
|
11875
|
+
"alias": "dayDecorationFn";
|
|
11876
|
+
"required": false;
|
|
11877
|
+
"isSignal": true;
|
|
11878
|
+
};
|
|
11879
|
+
"itemActionsFn": {
|
|
11880
|
+
"alias": "itemActionsFn";
|
|
11881
|
+
"required": false;
|
|
11882
|
+
"isSignal": true;
|
|
11883
|
+
};
|
|
11884
|
+
"agendaGroupFn": {
|
|
11885
|
+
"alias": "agendaGroupFn";
|
|
11886
|
+
"required": false;
|
|
11887
|
+
"isSignal": true;
|
|
11888
|
+
};
|
|
11687
11889
|
}, {
|
|
11688
11890
|
"view": "viewChange";
|
|
11689
11891
|
"anchorDate": "anchorDateChange";
|
|
@@ -11693,6 +11895,7 @@ export declare class CalendarComponent {
|
|
|
11693
11895
|
"dateClick": "dateClick";
|
|
11694
11896
|
"slotClick": "slotClick";
|
|
11695
11897
|
"moreClick": "moreClick";
|
|
11898
|
+
"itemAction": "itemAction";
|
|
11696
11899
|
}, never, ["[calendar-summary]", "[calendar-actions]", "[calendar-summary-mobile]"], true, never>;
|
|
11697
11900
|
}
|
|
11698
11901
|
/**
|
|
@@ -11887,7 +12090,7 @@ export declare class ShowComponent {
|
|
|
11887
12090
|
}, {}, never, ["*"], true, never>;
|
|
11888
12091
|
}
|
|
11889
12092
|
/**
|
|
11890
|
-
* Small formatting helpers shared by apps (money
|
|
12093
|
+
* Small formatting helpers shared by apps (money, postal addresses, names, phone numbers, durations and dates).
|
|
11891
12094
|
*/
|
|
11892
12095
|
export interface FormatCurrencyOptions {
|
|
11893
12096
|
/** ISO 4217 code. Default `'USD'`. */
|
|
@@ -11929,6 +12132,37 @@ export interface FormatAddressOptions {
|
|
|
11929
12132
|
* with `{ style: 'usa' }` -> `1 Main, Austin, TX 78701`.
|
|
11930
12133
|
*/
|
|
11931
12134
|
export declare function formatAddress(parts: AddressParts, options?: FormatAddressOptions): string;
|
|
12135
|
+
/**
|
|
12136
|
+
* The first letter of the first and last name: `getInitials('Sarah', 'Chen')` -> `SC`. A missing name contributes nothing (`getInitials('Sarah', '')` -> `S`).
|
|
12137
|
+
* Letters are returned as written (not upper-cased).
|
|
12138
|
+
*/
|
|
12139
|
+
export declare function getInitials(firstName: string | null | undefined, lastName: string | null | undefined): string;
|
|
12140
|
+
/**
|
|
12141
|
+
* A length of time in seconds as text: `formatDuration(90)` -> `1m 30s`, `formatDuration(45)` -> `45s`. `null`, `undefined` and 0 give `''`.
|
|
12142
|
+
* Hours are not split out (`3700` -> `61m 40s`).
|
|
12143
|
+
*/
|
|
12144
|
+
export declare function formatDuration(seconds: number | null | undefined): string;
|
|
12145
|
+
/**
|
|
12146
|
+
* A phone number as `(555) 555-5555` while it is typed or stored: `formatPhone('5125550001')` -> `(512) 555-0001`. A US `+1` / leading `1` is dropped,
|
|
12147
|
+
* other international numbers (a `+` that is not `+1` plus 10 digits) are returned as given, fewer digits give the partial form
|
|
12148
|
+
* (`'512555'` -> `(512) 555`, `'512'` -> `512`) and more than 10 digits are cut to 10. `null`, `undefined` and `''` give `''`.
|
|
12149
|
+
*/
|
|
12150
|
+
export declare function formatPhone(raw: string | null | undefined): string;
|
|
12151
|
+
/**
|
|
12152
|
+
* A US / Canada E.164 number as `+1 512 555-0100` (for showing a stored number). Any other value is returned as given (trimmed values are
|
|
12153
|
+
* still formatted: `' +15125550100 '` -> `+1 512 555-0100`); `null` and `undefined` give `''`. Use `formatPhone` for the domestic `(512) 555-0100` form.
|
|
12154
|
+
*/
|
|
12155
|
+
export declare function formatPhoneDisplay(e164: string | null | undefined): string;
|
|
12156
|
+
/**
|
|
12157
|
+
* A date as short text: `formatShortDate('2026-01-05')` -> `Jan 5, 2026`; `''` / `null` / `undefined` give `—`. A plain `YYYY-MM-DD` is read as a LOCAL
|
|
12158
|
+
* date (so it never shifts a day with the time zone); any other string goes through `new Date(...)` and uses the same en-US format.
|
|
12159
|
+
*/
|
|
12160
|
+
export declare function formatShortDate(value: string | null | undefined): string;
|
|
12161
|
+
/**
|
|
12162
|
+
* Today's date as `YYYY-MM-DD` in the given IANA time zone (e.g. the user's profile time zone): `todayInTimezone('America/Phoenix')` -> `2026-10-13`.
|
|
12163
|
+
* No or an invalid time zone falls back to the browser's local date.
|
|
12164
|
+
*/
|
|
12165
|
+
export declare function todayInTimezone(timezone?: string | null): string;
|
|
11932
12166
|
/**
|
|
11933
12167
|
* Starts the browser download of a blob under `fileName`. The anchor is attached to the page while it is clicked (Firefox ignores a click on
|
|
11934
12168
|
* a detached anchor) and the object URL is revoked 1000 ms later (Safari reads it asynchronously, so an immediate revoke can cancel the
|
|
@@ -14057,4 +14291,4 @@ export declare class ConversationsComponent {
|
|
|
14057
14291
|
"messagesRetry": "messagesRetry";
|
|
14058
14292
|
}, never, ["[uiConversationsContext]"], true, never>;
|
|
14059
14293
|
}
|
|
14060
|
-
export type { CalendarDay, CalendarRange, CalendarViewMode };
|
|
14294
|
+
export type { CalendarAgendaGroup, CalendarDay, CalendarDayLevel, CalendarRange, CalendarViewMode };
|