@foxeltech/angular-ui 0.7.83 → 0.7.101
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/components.css +40 -1
- package/fesm2022/foxeltech-angular-ui-chart.mjs +33 -3
- package/fesm2022/foxeltech-angular-ui-chart.mjs.map +1 -1
- package/fesm2022/foxeltech-angular-ui-flow.mjs +42 -5
- package/fesm2022/foxeltech-angular-ui-flow.mjs.map +1 -1
- package/fesm2022/foxeltech-angular-ui.mjs +559 -42
- package/fesm2022/foxeltech-angular-ui.mjs.map +1 -1
- package/package.json +3 -2
- package/src/lib/styles/components.css +40 -1
- package/src/lib/styles/utilities.css +2 -1
- package/src/lib/ui/components/breadcrumb/breadcrumb.component.css +262 -0
- package/src/lib/ui/components/breadcrumb/breadcrumb.component.html +91 -0
- package/src/lib/ui/components/button/button.component.html +1 -0
- package/src/lib/ui/components/filter-pills/filter-pills.component.html +1 -1
- package/src/lib/ui/components/load-status/load-status.component.css +96 -0
- package/src/lib/ui/components/load-status/load-status.component.html +20 -0
- package/src/lib/ui/components/master-detail/master-detail.component.css +63 -11
- package/src/lib/ui/components/master-detail/master-detail.component.html +71 -42
- package/src/lib/ui/components/route-skeleton/route-skeleton.component.css +1 -1
- package/src/lib/ui/components/segmented/segmented.component.html +3 -1
- package/src/lib/ui/components/severity-badges/severity-badges.component.html +1 -1
- package/src/lib/ui/components/stat-cards/stat-cards.component.css +18 -0
- package/src/lib/ui/components/stat-cards/stat-cards.component.html +3 -3
- package/types/foxeltech-angular-ui-chart.d.ts +18 -1
- package/types/foxeltech-angular-ui-flow.d.ts +7 -0
- package/types/foxeltech-angular-ui.d.ts +309 -8
- package/utilities.css +2 -1
|
@@ -60,6 +60,54 @@ declare class HttpWrapper {
|
|
|
60
60
|
disable(params: any): Promise<any>;
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
+
interface FxLoadJob {
|
|
64
|
+
id: number;
|
|
65
|
+
/** Short caller-supplied label — "summary", "history", "projects". */
|
|
66
|
+
label: string;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Backend-request bookkeeping behind the topbar load status (design
|
|
70
|
+
* "Loading States", 04/09): while any tracked request is in flight the shell
|
|
71
|
+
* shows a spinner + "Loading <label> · k of n" and a thin indeterminate bar;
|
|
72
|
+
* once the batch settles it shows "● Up to date · just now".
|
|
73
|
+
*
|
|
74
|
+
* A batch = every job started while at least one job is still pending. When
|
|
75
|
+
* the last one settles the batch closes (`lastUpdated` moves) and the next
|
|
76
|
+
* job opens a fresh count — so "k of n" always reads against the requests of
|
|
77
|
+
* the current page load, not the session total.
|
|
78
|
+
*
|
|
79
|
+
* Wire-ups: `fxListResolver` and `BaseTableComponent.fetch()` track
|
|
80
|
+
* automatically; screens with their own fetches call `track()`.
|
|
81
|
+
*/
|
|
82
|
+
declare class FxLoadStatusService {
|
|
83
|
+
private seq;
|
|
84
|
+
private readonly _pending;
|
|
85
|
+
private readonly _batchTotal;
|
|
86
|
+
private readonly _lastUpdated;
|
|
87
|
+
private readonly _reload;
|
|
88
|
+
/** Jobs still in flight, oldest first. */
|
|
89
|
+
readonly pending: _angular_core.Signal<FxLoadJob[]>;
|
|
90
|
+
/** Requests started in the current batch. */
|
|
91
|
+
readonly total: _angular_core.Signal<number>;
|
|
92
|
+
readonly done: _angular_core.Signal<number>;
|
|
93
|
+
readonly loading: _angular_core.Signal<boolean>;
|
|
94
|
+
/** Label of the oldest pending request — what the status line names. */
|
|
95
|
+
readonly current: _angular_core.Signal<string>;
|
|
96
|
+
/** When the last batch settled; null until the first one does. */
|
|
97
|
+
readonly lastUpdated: _angular_core.Signal<Date | null>;
|
|
98
|
+
/** Fired by the topbar ↻ — the shell decides how to re-fetch the route. */
|
|
99
|
+
readonly reload$: rxjs.Observable<void>;
|
|
100
|
+
/** Register a request; call the returned function when it settles. */
|
|
101
|
+
begin(label: string): () => void;
|
|
102
|
+
/** Track a promise (or a factory producing one) under `label`. */
|
|
103
|
+
track<T>(label: string, work: Promise<T> | (() => Promise<T>)): Promise<T>;
|
|
104
|
+
requestReload(): void;
|
|
105
|
+
/** Short label from a request url: `/TEST1/history` → "history", `/search` → "search". */
|
|
106
|
+
static labelFromUrl(url: string): string;
|
|
107
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<FxLoadStatusService, never>;
|
|
108
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<FxLoadStatusService>;
|
|
109
|
+
}
|
|
110
|
+
|
|
63
111
|
interface ToastData {
|
|
64
112
|
id: number;
|
|
65
113
|
message: string;
|
|
@@ -118,6 +166,8 @@ declare class BaseTableComponent<T = any> extends BaseComponent implements OnIni
|
|
|
118
166
|
loading: boolean;
|
|
119
167
|
expandedElement: T | null;
|
|
120
168
|
toastr: FxToastrService;
|
|
169
|
+
/** Topbar load status; optional so hand-rolled test injectors keep working. */
|
|
170
|
+
protected loadStatus: FxLoadStatusService | null;
|
|
121
171
|
_lock: boolean;
|
|
122
172
|
keywordChange$: Subject<string>;
|
|
123
173
|
dataSourcePlaceholder: any[];
|
|
@@ -157,7 +207,22 @@ declare class BaseTableComponent<T = any> extends BaseComponent implements OnIni
|
|
|
157
207
|
message?: string;
|
|
158
208
|
};
|
|
159
209
|
};
|
|
160
|
-
|
|
210
|
+
/**
|
|
211
|
+
* The paging engine. Either the page's own <mat-paginator> (found by the
|
|
212
|
+
* ViewChild query) or one handed in by a child such as fx-ui-master-detail,
|
|
213
|
+
* whose paginator lives in ITS view where the query cannot see it.
|
|
214
|
+
*
|
|
215
|
+
* ⚠️ A plain `@ViewChild` property was clobbered: the query re-runs before
|
|
216
|
+
* every ngAfterViewInit and, finding nothing, wrote `undefined` over the
|
|
217
|
+
* instance the child had assigned a moment earlier — so page events were
|
|
218
|
+
* never subscribed and Prev/Next changed the range text but not the rows
|
|
219
|
+
* (anh Tú 04/09). The setter attaches on any real assignment and ignores
|
|
220
|
+
* `undefined`, so whichever side provides the paginator wins.
|
|
221
|
+
*/
|
|
222
|
+
set paginator(p: MatPaginator | undefined);
|
|
223
|
+
get paginator(): MatPaginator;
|
|
224
|
+
private _paginator?;
|
|
225
|
+
private _pageSub?;
|
|
161
226
|
readonly table: _angular_core.Signal<MatTable<any>>;
|
|
162
227
|
constructor(injector: Injector, api: HttpWrapper, modal: MatDialog, ref: ChangeDetectorRef);
|
|
163
228
|
ngOnInit(): void;
|
|
@@ -934,10 +999,57 @@ declare class AuthInterceptor implements HttpInterceptor {
|
|
|
934
999
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AuthInterceptor>;
|
|
935
1000
|
}
|
|
936
1001
|
|
|
1002
|
+
/** One row of a crumb's switcher panel. */
|
|
1003
|
+
interface BreadcrumbOption {
|
|
1004
|
+
label: string;
|
|
1005
|
+
value: string;
|
|
1006
|
+
/** Where picking the row navigates. */
|
|
1007
|
+
url: string;
|
|
1008
|
+
/** Muted trailing text (a risk chip, a date, a status). */
|
|
1009
|
+
meta?: string;
|
|
1010
|
+
}
|
|
1011
|
+
/**
|
|
1012
|
+
* V2 topbar (design 02/12/13): a crumb that names an entity — the project, the
|
|
1013
|
+
* analysed binary — is a bordered chip with a dropdown to switch to a sibling.
|
|
1014
|
+
* The caller owns the data: `load` runs on open and on every keystroke.
|
|
1015
|
+
*/
|
|
1016
|
+
interface BreadcrumbSwitcher {
|
|
1017
|
+
/** Panel heading, e.g. "Switch project". */
|
|
1018
|
+
title: string;
|
|
1019
|
+
/** Search box placeholder; omit to render no search box. */
|
|
1020
|
+
filterPlaceholder?: string;
|
|
1021
|
+
/** Value of the option currently in scope — rendered with a check mark. */
|
|
1022
|
+
selected?: string;
|
|
1023
|
+
/** Options for the keyword ('' on open). Caller-translated labels. */
|
|
1024
|
+
load: (keyword: string) => Promise<BreadcrumbOption[]>;
|
|
1025
|
+
/** Copy for an empty result. */
|
|
1026
|
+
emptyLabel?: string;
|
|
1027
|
+
/** Quiet link under the options — "View all projects". */
|
|
1028
|
+
viewAll?: {
|
|
1029
|
+
label: string;
|
|
1030
|
+
url: string;
|
|
1031
|
+
};
|
|
1032
|
+
/** Accent-soft CTA at the bottom — "Create project". */
|
|
1033
|
+
create?: {
|
|
1034
|
+
label: string;
|
|
1035
|
+
url: string;
|
|
1036
|
+
};
|
|
1037
|
+
/** Options render in the mono face (binary identities). */
|
|
1038
|
+
mono?: boolean;
|
|
1039
|
+
}
|
|
937
1040
|
interface Breadcrumb {
|
|
938
1041
|
label: string;
|
|
939
1042
|
url?: string;
|
|
940
1043
|
code?: string;
|
|
1044
|
+
/**
|
|
1045
|
+
* Heroicon drawn in accent before the label. Setting it (or `switcher`)
|
|
1046
|
+
* turns the crumb into a chip — the design's project / analysis pickers.
|
|
1047
|
+
*/
|
|
1048
|
+
icon?: string;
|
|
1049
|
+
/** Mono face for binary identities ("rocketchat.exe · 4.8.1"). */
|
|
1050
|
+
mono?: boolean;
|
|
1051
|
+
/** Dropdown to switch the entity this crumb names. */
|
|
1052
|
+
switcher?: BreadcrumbSwitcher;
|
|
941
1053
|
}
|
|
942
1054
|
declare class BreadcrumbService {
|
|
943
1055
|
private breadcrumbs$;
|
|
@@ -1691,6 +1803,11 @@ declare class StatCardsComponent {
|
|
|
1691
1803
|
readonly variant: _angular_core.InputSignal<"figure" | "tile">;
|
|
1692
1804
|
/** Grid columns; defaults to one column per card. */
|
|
1693
1805
|
cols?: number;
|
|
1806
|
+
/**
|
|
1807
|
+
* Column count for the ≥ md (720px) container. Below that the CSS takes
|
|
1808
|
+
* over (2-up, then 1-up under 360px) — see stat-cards.component.css — so an
|
|
1809
|
+
* explicit `cols` never squeezes four figures into a phone-width row.
|
|
1810
|
+
*/
|
|
1694
1811
|
get gridColumns(): string;
|
|
1695
1812
|
numClass(card: FxStatCard): string;
|
|
1696
1813
|
boxClass(card: FxStatCard): string;
|
|
@@ -1758,6 +1875,12 @@ declare class FilterPillsComponent {
|
|
|
1758
1875
|
/** Accepts undefined so screens can bind an optional filter-bag key. */
|
|
1759
1876
|
readonly value: _angular_core.InputSignal<string | undefined>;
|
|
1760
1877
|
readonly valueChange: _angular_core.OutputEmitterRef<string>;
|
|
1878
|
+
/**
|
|
1879
|
+
* Fill of the ACTIVE pill. 'accent' (default, design 11 vulnerabilities);
|
|
1880
|
+
* 'solid' = `--og-text` on inverse text — the demo's Attack-paths panel on
|
|
1881
|
+
* the Overview tab (design 02 "All paths 164") and Recent analyses (design 13).
|
|
1882
|
+
*/
|
|
1883
|
+
readonly tone: _angular_core.InputSignal<"accent" | "solid">;
|
|
1761
1884
|
isActive(option: FxFilterPillOption): boolean;
|
|
1762
1885
|
/**
|
|
1763
1886
|
* Pill ĐANG CHỌN dùng **accent** (xanh), không phải nền đen — khớp demo:
|
|
@@ -1768,7 +1891,7 @@ declare class FilterPillsComponent {
|
|
|
1768
1891
|
pillClass(option: FxFilterPillOption): string;
|
|
1769
1892
|
countClass(option: FxFilterPillOption): string;
|
|
1770
1893
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<FilterPillsComponent, never>;
|
|
1771
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<FilterPillsComponent, "fx-ui-filter-pills", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
|
|
1894
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<FilterPillsComponent, "fx-ui-filter-pills", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
|
|
1772
1895
|
}
|
|
1773
1896
|
|
|
1774
1897
|
/**
|
|
@@ -1966,19 +2089,33 @@ declare class MasterDetailComponent implements AfterViewInit, AfterContentInit {
|
|
|
1966
2089
|
/** Caller-translated Prev/Next labels ("X of Y" is numeric). */
|
|
1967
2090
|
readonly prevLabel: _angular_core.InputSignal<string>;
|
|
1968
2091
|
readonly nextLabel: _angular_core.InputSignal<string>;
|
|
2092
|
+
/** "Page 1 of 4" (design 11/14/17) — the two words, caller-translated. */
|
|
2093
|
+
readonly pageLabel: _angular_core.InputSignal<string>;
|
|
2094
|
+
readonly ofLabel: _angular_core.InputSignal<string>;
|
|
2095
|
+
/**
|
|
2096
|
+
* Facets rail open (design 11/14) or collapsed to a 40px strip (design 17).
|
|
2097
|
+
* The user can toggle either way; this only sets the initial state.
|
|
2098
|
+
*/
|
|
2099
|
+
readonly facetsOpen: _angular_core.InputSignal<boolean>;
|
|
2100
|
+
/** Caller-translated rail heading ("Scope & facets"). */
|
|
2101
|
+
readonly facetsLabel: _angular_core.InputSignal<string>;
|
|
2102
|
+
readonly expandFacetsLabel: _angular_core.InputSignal<string>;
|
|
2103
|
+
readonly collapseFacetsLabel: _angular_core.InputSignal<string>;
|
|
2104
|
+
/** Current rail state — follows `facetsOpen` until the user toggles. */
|
|
2105
|
+
readonly railOpen: _angular_core.WritableSignal<boolean>;
|
|
1969
2106
|
readonly rowTemplate: _angular_core.Signal<TemplateRef<any>>;
|
|
1970
2107
|
readonly detailTemplate: _angular_core.Signal<TemplateRef<any>>;
|
|
1971
2108
|
readonly paginator: _angular_core.Signal<MatPaginator>;
|
|
1972
2109
|
readonly uid: string;
|
|
1973
2110
|
ngAfterContentInit(): void;
|
|
1974
2111
|
ngAfterViewInit(): void;
|
|
1975
|
-
/** "X of Y"
|
|
2112
|
+
/** "Page X of Y" for the prevnext pagination style (design 11/14/17). */
|
|
1976
2113
|
rangeText(): string;
|
|
1977
2114
|
isSelected(row: any): boolean;
|
|
1978
2115
|
optionId(index: number): string;
|
|
1979
2116
|
onKeydown(event: KeyboardEvent, index: number): void;
|
|
1980
2117
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<MasterDetailComponent, never>;
|
|
1981
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<MasterDetailComponent, "fx-ui-master-detail", never, { "table": { "alias": "table"; "required": false; }; "listWidth": { "alias": "listWidth"; "required": false; "isSignal": true; }; "paneHeight": { "alias": "paneHeight"; "required": false; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "listLabel": { "alias": "listLabel"; "required": false; "isSignal": true; }; "skeletonCards": { "alias": "skeletonCards"; "required": false; "isSignal": true; }; "paginationStyle": { "alias": "paginationStyle"; "required": false; "isSignal": true; }; "prevLabel": { "alias": "prevLabel"; "required": false; "isSignal": true; }; "nextLabel": { "alias": "nextLabel"; "required": false; "isSignal": true; }; }, {}, ["rowTemplate", "detailTemplate"], ["[mdFacets]", "[mdHeader]", "[mdFilters]"], true, never>;
|
|
2118
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<MasterDetailComponent, "fx-ui-master-detail", never, { "table": { "alias": "table"; "required": false; }; "listWidth": { "alias": "listWidth"; "required": false; "isSignal": true; }; "paneHeight": { "alias": "paneHeight"; "required": false; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "listLabel": { "alias": "listLabel"; "required": false; "isSignal": true; }; "skeletonCards": { "alias": "skeletonCards"; "required": false; "isSignal": true; }; "paginationStyle": { "alias": "paginationStyle"; "required": false; "isSignal": true; }; "prevLabel": { "alias": "prevLabel"; "required": false; "isSignal": true; }; "nextLabel": { "alias": "nextLabel"; "required": false; "isSignal": true; }; "pageLabel": { "alias": "pageLabel"; "required": false; "isSignal": true; }; "ofLabel": { "alias": "ofLabel"; "required": false; "isSignal": true; }; "facetsOpen": { "alias": "facetsOpen"; "required": false; "isSignal": true; }; "facetsLabel": { "alias": "facetsLabel"; "required": false; "isSignal": true; }; "expandFacetsLabel": { "alias": "expandFacetsLabel"; "required": false; "isSignal": true; }; "collapseFacetsLabel": { "alias": "collapseFacetsLabel"; "required": false; "isSignal": true; }; }, {}, ["rowTemplate", "detailTemplate"], ["[mdFacets]", "[mdHeader]", "[mdFilters]"], true, never>;
|
|
1982
2119
|
}
|
|
1983
2120
|
|
|
1984
2121
|
interface FxMenuItem {
|
|
@@ -2060,6 +2197,80 @@ declare class PendingBadgeComponent {
|
|
|
2060
2197
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<PendingBadgeComponent, "fx-ui-pending-badge", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "field": { "alias": "field"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
2061
2198
|
}
|
|
2062
2199
|
|
|
2200
|
+
/**
|
|
2201
|
+
* V2 topbar breadcrumb (design 02/12/13, measured on the demo 04/09).
|
|
2202
|
+
*
|
|
2203
|
+
* Projects / [◳ RocketChat ▾] / [⬡ rocketchat.exe · 4.8.1 ▾]
|
|
2204
|
+
*
|
|
2205
|
+
* Plain crumbs are quiet links (12.5px / 500 / muted); the last one is strong.
|
|
2206
|
+
* A crumb with `icon` or `switcher` renders as a chip — hairline border,
|
|
2207
|
+
* surface fill, 1px shadow — and a `switcher` opens a listbox with a filter
|
|
2208
|
+
* box, the sibling options, an optional "View all" row and a "Create" CTA.
|
|
2209
|
+
* Data comes from the app through `BreadcrumbService`; this component only
|
|
2210
|
+
* draws and navigates.
|
|
2211
|
+
*/
|
|
2212
|
+
declare class BreadcrumbComponent {
|
|
2213
|
+
private readonly service;
|
|
2214
|
+
private readonly router;
|
|
2215
|
+
private readonly host;
|
|
2216
|
+
readonly crumbs: _angular_core.Signal<Breadcrumb[]>;
|
|
2217
|
+
/** Index of the crumb whose switcher panel is open; null = closed. */
|
|
2218
|
+
readonly openIndex: _angular_core.WritableSignal<number | null>;
|
|
2219
|
+
readonly options: _angular_core.WritableSignal<BreadcrumbOption[]>;
|
|
2220
|
+
readonly loading: _angular_core.WritableSignal<boolean>;
|
|
2221
|
+
readonly keyword: _angular_core.WritableSignal<string>;
|
|
2222
|
+
/** Drops results of a superseded load (typing fast, reopening). */
|
|
2223
|
+
private loadSeq;
|
|
2224
|
+
isChip(crumb: Breadcrumb): boolean;
|
|
2225
|
+
onChipClick(crumb: Breadcrumb, index: number, event: MouseEvent): void;
|
|
2226
|
+
private open;
|
|
2227
|
+
close(): void;
|
|
2228
|
+
onFilter(crumb: Breadcrumb, value: string): void;
|
|
2229
|
+
private load;
|
|
2230
|
+
pick(option: BreadcrumbOption, event: Event): void;
|
|
2231
|
+
go(event: Event, url?: string): void;
|
|
2232
|
+
private navigate;
|
|
2233
|
+
onDocumentClick(event: MouseEvent): void;
|
|
2234
|
+
onEscape(): void;
|
|
2235
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<BreadcrumbComponent, never>;
|
|
2236
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<BreadcrumbComponent, "fx-ui-breadcrumb", never, {}, {}, never, never, true, never>;
|
|
2237
|
+
}
|
|
2238
|
+
|
|
2239
|
+
/**
|
|
2240
|
+
* Topbar load status (design "Loading States", measured 04/09):
|
|
2241
|
+
*
|
|
2242
|
+
* ◌ Loading charts · 1 of 4 → while requests are pending
|
|
2243
|
+
* ● Up to date · just now ↻ → once the batch settled
|
|
2244
|
+
*
|
|
2245
|
+
* Mono 10.5px; muted while loading, faint when idle; 11px spinner (2px ring,
|
|
2246
|
+
* accent top). With `bar` a 2px indeterminate strip is drawn along the top
|
|
2247
|
+
* edge of the nearest positioned ancestor (the topbar) while loading.
|
|
2248
|
+
* Labels are caller-translated inputs; the ↻ button emits `reload`.
|
|
2249
|
+
*/
|
|
2250
|
+
declare class LoadStatusComponent {
|
|
2251
|
+
readonly status: FxLoadStatusService;
|
|
2252
|
+
readonly loadingLabel: _angular_core.InputSignal<string>;
|
|
2253
|
+
readonly ofLabel: _angular_core.InputSignal<string>;
|
|
2254
|
+
readonly upToDateLabel: _angular_core.InputSignal<string>;
|
|
2255
|
+
readonly justNowLabel: _angular_core.InputSignal<string>;
|
|
2256
|
+
/** `{n}` is replaced by the minute count. */
|
|
2257
|
+
readonly minutesAgoLabel: _angular_core.InputSignal<string>;
|
|
2258
|
+
readonly reloadLabel: _angular_core.InputSignal<string>;
|
|
2259
|
+
/** Draw the 2px indeterminate bar along the top of the positioned ancestor. */
|
|
2260
|
+
readonly bar: _angular_core.InputSignal<boolean>;
|
|
2261
|
+
/** Show the ↻ button. */
|
|
2262
|
+
readonly showReload: _angular_core.InputSignal<boolean>;
|
|
2263
|
+
readonly reload: _angular_core.OutputEmitterRef<void>;
|
|
2264
|
+
/** Ticks every 30 s so "just now" ages into "N min ago" without traffic. */
|
|
2265
|
+
private readonly tick;
|
|
2266
|
+
constructor();
|
|
2267
|
+
readonly loadingText: _angular_core.Signal<string>;
|
|
2268
|
+
readonly idleText: _angular_core.Signal<string>;
|
|
2269
|
+
onReload(): void;
|
|
2270
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<LoadStatusComponent, never>;
|
|
2271
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<LoadStatusComponent, "fx-ui-load-status", never, { "loadingLabel": { "alias": "loadingLabel"; "required": false; "isSignal": true; }; "ofLabel": { "alias": "ofLabel"; "required": false; "isSignal": true; }; "upToDateLabel": { "alias": "upToDateLabel"; "required": false; "isSignal": true; }; "justNowLabel": { "alias": "justNowLabel"; "required": false; "isSignal": true; }; "minutesAgoLabel": { "alias": "minutesAgoLabel"; "required": false; "isSignal": true; }; "reloadLabel": { "alias": "reloadLabel"; "required": false; "isSignal": true; }; "bar": { "alias": "bar"; "required": false; "isSignal": true; }; "showReload": { "alias": "showReload"; "required": false; "isSignal": true; }; }, { "reload": "reload"; }, never, never, true, never>;
|
|
2272
|
+
}
|
|
2273
|
+
|
|
2063
2274
|
/**
|
|
2064
2275
|
* Wraps UI that is rendered from PLACEHOLDER data so the layout can be
|
|
2065
2276
|
* reviewed before its endpoint exists (anh Tú 29/08: "muốn có full giao diện
|
|
@@ -2184,7 +2395,7 @@ declare class SegmentedComponent {
|
|
|
2184
2395
|
* the demo's detail-pane tabs ("Affected software · Summary · Evidence"),
|
|
2185
2396
|
* where equal columns would truncate the long label in a narrow pane.
|
|
2186
2397
|
*/
|
|
2187
|
-
readonly fit: _angular_core.InputSignal<"
|
|
2398
|
+
readonly fit: _angular_core.InputSignal<"content" | "equal">;
|
|
2188
2399
|
private readonly optionEls;
|
|
2189
2400
|
/** Measured box of the active segment — only used when fit === 'content'. */
|
|
2190
2401
|
private readonly thumbBox;
|
|
@@ -2467,6 +2678,80 @@ declare class ConfirmationDialogComponent {
|
|
|
2467
2678
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ConfirmationDialogComponent, "fx-ui-confirmation-dialog", never, {}, {}, never, never, true, never>;
|
|
2468
2679
|
}
|
|
2469
2680
|
|
|
2681
|
+
/**
|
|
2682
|
+
* Staggered entrance for one element (GSAP).
|
|
2683
|
+
*
|
|
2684
|
+
* <fx-ui-section-card [fxReveal]="2">…</fx-ui-section-card>
|
|
2685
|
+
*
|
|
2686
|
+
* The host starts invisible and rises into place; `fxReveal` is its slot in
|
|
2687
|
+
* the stagger (× 60 ms). Elements that mount later (async lists) animate on
|
|
2688
|
+
* their own mount, so late data arrives with motion instead of a jump.
|
|
2689
|
+
* Reduced-motion users see the final state immediately. For a whole page use
|
|
2690
|
+
* `fxRevealGroup` on the container instead of numbering children by hand.
|
|
2691
|
+
*/
|
|
2692
|
+
declare class FxRevealDirective {
|
|
2693
|
+
/** Stagger slot; 0 = first. */
|
|
2694
|
+
readonly fxReveal: _angular_core.InputSignal<string | number | undefined>;
|
|
2695
|
+
private readonly el;
|
|
2696
|
+
constructor();
|
|
2697
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<FxRevealDirective, never>;
|
|
2698
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FxRevealDirective, "[fxReveal]", never, { "fxReveal": { "alias": "fxReveal"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
2699
|
+
}
|
|
2700
|
+
/** Run the standard reveal on an element at the given stagger slot. */
|
|
2701
|
+
declare function fxRevealElement(el: HTMLElement, slot?: number): void;
|
|
2702
|
+
|
|
2703
|
+
/**
|
|
2704
|
+
* One attribute on a page root reveals its sections top-to-bottom.
|
|
2705
|
+
*
|
|
2706
|
+
* <div fxRevealGroup> ← page root
|
|
2707
|
+
* <div>heading…</div> ← slot 0
|
|
2708
|
+
* <fx-ui-stat-cards …/> ← slot 1
|
|
2709
|
+
* <div class="grid …">…</div> ← slot 2 (the grid moves as one block)
|
|
2710
|
+
* </div>
|
|
2711
|
+
*
|
|
2712
|
+
* Direct element children present at first render get consecutive slots.
|
|
2713
|
+
* Children added later (a list that arrives after its request, an `@if` that
|
|
2714
|
+
* flips) are revealed as they mount, so async content never pops in flat.
|
|
2715
|
+
* Skeletons (`fx-ui-route-skeleton`, `[aria-busy]`) are left alone. Replaces
|
|
2716
|
+
* the page-level `animate.enter="fade-in-animation"` one-shot fade.
|
|
2717
|
+
*/
|
|
2718
|
+
declare class FxRevealGroupDirective implements OnDestroy {
|
|
2719
|
+
/** Cap on how many children get their own slot; the rest share the last one. */
|
|
2720
|
+
readonly fxRevealGroup: _angular_core.InputSignal<string | number | undefined>;
|
|
2721
|
+
private readonly el;
|
|
2722
|
+
private observer?;
|
|
2723
|
+
private readonly seen;
|
|
2724
|
+
constructor();
|
|
2725
|
+
private children;
|
|
2726
|
+
private eligible;
|
|
2727
|
+
private hide;
|
|
2728
|
+
private reveal;
|
|
2729
|
+
ngOnDestroy(): void;
|
|
2730
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<FxRevealGroupDirective, never>;
|
|
2731
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FxRevealGroupDirective, "[fxRevealGroup]", never, { "fxRevealGroup": { "alias": "fxRevealGroup"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
2732
|
+
}
|
|
2733
|
+
|
|
2734
|
+
/**
|
|
2735
|
+
* Counts a figure up from 0 (GSAP) whenever its value changes.
|
|
2736
|
+
*
|
|
2737
|
+
* <span [fxCountUp]="card.value"></span>
|
|
2738
|
+
*
|
|
2739
|
+
* Numbers tween over 0.8 s and render with the user's locale grouping; any
|
|
2740
|
+
* non-numeric value ('--', '98 / 100', '1,224') is written verbatim so pending
|
|
2741
|
+
* or composite figures never animate to nonsense. Reduced motion → final value.
|
|
2742
|
+
*/
|
|
2743
|
+
declare class FxCountUpDirective implements OnDestroy {
|
|
2744
|
+
readonly fxCountUp: _angular_core.InputSignal<string | number | null | undefined>;
|
|
2745
|
+
private readonly el;
|
|
2746
|
+
private tween?;
|
|
2747
|
+
private readonly state;
|
|
2748
|
+
constructor();
|
|
2749
|
+
private format;
|
|
2750
|
+
ngOnDestroy(): void;
|
|
2751
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<FxCountUpDirective, never>;
|
|
2752
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FxCountUpDirective, "[fxCountUp]", never, { "fxCountUp": { "alias": "fxCountUp"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
2753
|
+
}
|
|
2754
|
+
|
|
2470
2755
|
/**
|
|
2471
2756
|
* Compatibility barrel over the (now standalone) core components.
|
|
2472
2757
|
*
|
|
@@ -2480,9 +2765,25 @@ declare class ConfirmationDialogComponent {
|
|
|
2480
2765
|
*/
|
|
2481
2766
|
declare class UiModule {
|
|
2482
2767
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiModule, never>;
|
|
2483
|
-
static ɵmod: _angular_core.ɵɵNgModuleDeclaration<UiModule, never, [typeof i1$1.FormsModule, typeof i1$1.ReactiveFormsModule, typeof i2.RouterModule, typeof HasPermissionDirective, typeof TrimOnBlurDirective, typeof InputComponent, typeof SelectComponent, typeof RadioButtonComponent, typeof CheckboxComponent, typeof DndUploadComponent, typeof ButtonComponent, typeof RadioButtonToggleComponent, typeof DatetimePicker, typeof LoadingPanel, typeof SearchBarComponent, typeof TabGroupComponent, typeof TabComponent, typeof HeroIconComponent, typeof ToastComponent, typeof ToastContainerComponent, typeof TagComponent, typeof SliderComponent, typeof SwitchComponent, typeof CircleProgressBar, typeof TreeDiagram, typeof TableCell, typeof KanbanBoardComponent, typeof DrawerComponent, typeof SkeletonListComponent, typeof SkeletonDetailComponent, typeof StatCardsComponent, typeof EmptyStateComponent, typeof FilterChipsComponent, typeof FilterPillsComponent, typeof StageDotsComponent, typeof CodeBlockComponent, typeof ScreenshotFrameComponent, typeof MeterComponent, typeof SectionCardComponent, typeof InfoFieldComponent, typeof SeverityBadgesComponent, typeof MasterDetailComponent, typeof MenuComponent, typeof ThemePickerComponent, typeof PendingBadgeComponent, typeof SampleFrameComponent, typeof ScoreBadgeComponent, typeof StatusDotComponent, typeof SparkbarComponent, typeof SegmentedComponent, typeof ListRowComponent, typeof BarListComponent, typeof FacetsRailComponent, typeof ProjectCardComponent, typeof PipelineStepperComponent, typeof SkeletonFacetsComponent, typeof SkeletonDashboardComponent, typeof SkeletonFrameComponent, typeof RouteSkeletonComponent, typeof ConfirmationDialogComponent], [typeof InputComponent, typeof SelectComponent, typeof RadioButtonComponent, typeof CheckboxComponent, typeof DndUploadComponent, typeof ButtonComponent, typeof RadioButtonToggleComponent, typeof DatetimePicker, typeof LoadingPanel, typeof SearchBarComponent, typeof TabGroupComponent, typeof TabComponent, typeof HeroIconComponent, typeof ToastComponent, typeof ToastContainerComponent, typeof TagComponent, typeof SliderComponent, typeof SwitchComponent, typeof CircleProgressBar, typeof TreeDiagram, typeof TableCell, typeof KanbanBoardComponent, typeof DrawerComponent, typeof SkeletonListComponent, typeof SkeletonDetailComponent, typeof StatCardsComponent, typeof EmptyStateComponent, typeof FilterChipsComponent, typeof FilterPillsComponent, typeof StageDotsComponent, typeof CodeBlockComponent, typeof ScreenshotFrameComponent, typeof MeterComponent, typeof SectionCardComponent, typeof InfoFieldComponent, typeof SeverityBadgesComponent, typeof MasterDetailComponent, typeof MenuComponent, typeof ThemePickerComponent, typeof PendingBadgeComponent, typeof SampleFrameComponent, typeof ScoreBadgeComponent, typeof StatusDotComponent, typeof SparkbarComponent, typeof SegmentedComponent, typeof ListRowComponent, typeof BarListComponent, typeof FacetsRailComponent, typeof ProjectCardComponent, typeof PipelineStepperComponent, typeof SkeletonFacetsComponent, typeof SkeletonDashboardComponent, typeof SkeletonFrameComponent, typeof RouteSkeletonComponent, typeof ConfirmationDialogComponent, typeof i1$1.FormsModule, typeof i1$1.ReactiveFormsModule, typeof i2.RouterModule, typeof HasPermissionDirective, typeof TrimOnBlurDirective]>;
|
|
2768
|
+
static ɵmod: _angular_core.ɵɵNgModuleDeclaration<UiModule, never, [typeof i1$1.FormsModule, typeof i1$1.ReactiveFormsModule, typeof i2.RouterModule, typeof HasPermissionDirective, typeof TrimOnBlurDirective, typeof InputComponent, typeof SelectComponent, typeof RadioButtonComponent, typeof CheckboxComponent, typeof DndUploadComponent, typeof ButtonComponent, typeof RadioButtonToggleComponent, typeof DatetimePicker, typeof LoadingPanel, typeof SearchBarComponent, typeof TabGroupComponent, typeof TabComponent, typeof HeroIconComponent, typeof ToastComponent, typeof ToastContainerComponent, typeof TagComponent, typeof SliderComponent, typeof SwitchComponent, typeof CircleProgressBar, typeof TreeDiagram, typeof TableCell, typeof KanbanBoardComponent, typeof DrawerComponent, typeof SkeletonListComponent, typeof SkeletonDetailComponent, typeof StatCardsComponent, typeof EmptyStateComponent, typeof FilterChipsComponent, typeof FilterPillsComponent, typeof StageDotsComponent, typeof CodeBlockComponent, typeof ScreenshotFrameComponent, typeof MeterComponent, typeof SectionCardComponent, typeof InfoFieldComponent, typeof SeverityBadgesComponent, typeof MasterDetailComponent, typeof MenuComponent, typeof ThemePickerComponent, typeof PendingBadgeComponent, typeof BreadcrumbComponent, typeof LoadStatusComponent, typeof SampleFrameComponent, typeof ScoreBadgeComponent, typeof StatusDotComponent, typeof SparkbarComponent, typeof SegmentedComponent, typeof ListRowComponent, typeof BarListComponent, typeof FacetsRailComponent, typeof ProjectCardComponent, typeof PipelineStepperComponent, typeof SkeletonFacetsComponent, typeof SkeletonDashboardComponent, typeof SkeletonFrameComponent, typeof RouteSkeletonComponent, typeof ConfirmationDialogComponent, typeof FxRevealDirective, typeof FxRevealGroupDirective, typeof FxCountUpDirective], [typeof InputComponent, typeof SelectComponent, typeof RadioButtonComponent, typeof CheckboxComponent, typeof DndUploadComponent, typeof ButtonComponent, typeof RadioButtonToggleComponent, typeof DatetimePicker, typeof LoadingPanel, typeof SearchBarComponent, typeof TabGroupComponent, typeof TabComponent, typeof HeroIconComponent, typeof ToastComponent, typeof ToastContainerComponent, typeof TagComponent, typeof SliderComponent, typeof SwitchComponent, typeof CircleProgressBar, typeof TreeDiagram, typeof TableCell, typeof KanbanBoardComponent, typeof DrawerComponent, typeof SkeletonListComponent, typeof SkeletonDetailComponent, typeof StatCardsComponent, typeof EmptyStateComponent, typeof FilterChipsComponent, typeof FilterPillsComponent, typeof StageDotsComponent, typeof CodeBlockComponent, typeof ScreenshotFrameComponent, typeof MeterComponent, typeof SectionCardComponent, typeof InfoFieldComponent, typeof SeverityBadgesComponent, typeof MasterDetailComponent, typeof MenuComponent, typeof ThemePickerComponent, typeof PendingBadgeComponent, typeof BreadcrumbComponent, typeof LoadStatusComponent, typeof SampleFrameComponent, typeof ScoreBadgeComponent, typeof StatusDotComponent, typeof SparkbarComponent, typeof SegmentedComponent, typeof ListRowComponent, typeof BarListComponent, typeof FacetsRailComponent, typeof ProjectCardComponent, typeof PipelineStepperComponent, typeof SkeletonFacetsComponent, typeof SkeletonDashboardComponent, typeof SkeletonFrameComponent, typeof RouteSkeletonComponent, typeof ConfirmationDialogComponent, typeof FxRevealDirective, typeof FxRevealGroupDirective, typeof FxCountUpDirective, typeof i1$1.FormsModule, typeof i1$1.ReactiveFormsModule, typeof i2.RouterModule, typeof HasPermissionDirective, typeof TrimOnBlurDirective]>;
|
|
2484
2769
|
static ɵinj: _angular_core.ɵɵInjectorDeclaration<UiModule>;
|
|
2485
2770
|
}
|
|
2486
2771
|
|
|
2487
|
-
|
|
2488
|
-
|
|
2772
|
+
/** Users who asked the OS for reduced motion get instant state changes. */
|
|
2773
|
+
declare function fxMotionAllowed(): boolean;
|
|
2774
|
+
/** Shared timing so every screen moves the same way. */
|
|
2775
|
+
declare const FX_MOTION: {
|
|
2776
|
+
readonly duration: 0.5;
|
|
2777
|
+
/** Delay between consecutive slots. */
|
|
2778
|
+
readonly stagger: 0.06;
|
|
2779
|
+
/** Never let a long list push the last item beyond this delay. */
|
|
2780
|
+
readonly maxSlot: 12;
|
|
2781
|
+
readonly travelPx: 12;
|
|
2782
|
+
readonly ease: "power2.out";
|
|
2783
|
+
};
|
|
2784
|
+
|
|
2785
|
+
/** Motion directives exported by UiModule (GSAP-based, reduced-motion aware). */
|
|
2786
|
+
declare const FX_MOTION_DIRECTIVES: readonly [typeof FxRevealDirective, typeof FxRevealGroupDirective, typeof FxCountUpDirective];
|
|
2787
|
+
|
|
2788
|
+
export { AuthInterceptor, AuthStateService, BarListComponent, BaseComponent, BaseDialogComponent, BaseMasterDetailComponent, BaseTableComponent, BreadcrumbComponent, BreadcrumbService, ButtonComponent, CheckboxComponent, CircleProgressBar, CodeBlockComponent, ConfirmationDialogComponent, DatetimePicker, DndUploadComponent, DrawerComponent, EmptyStateComponent, FX_ICON_SPRITE_URL, FX_MOTION, FX_MOTION_DIRECTIVES, FX_SKELETON_DATA_KEY, FacetsRailComponent, FilterChipsComponent, FilterPillsComponent, FxComponent, FxCountUpDirective, FxDialogService, FxLoadStatusService, FxLoadingService, FxRevealDirective, FxRevealGroupDirective, FxRouteSkeletonService, FxStorageService, FxToastrService, FxUtils, FxValidators, HasPermissionDirective, HeroIconComponent, HttpLoaderFactory, HttpWrapper, InfoFieldComponent, InputComponent, KanbanBoardComponent, ListRowComponent, LoadStatusComponent, LoadingPanel, MasterDetailComponent, MenuComponent, MeterComponent, NotificationService, OG_LIGHT_THEMES, OG_PICKER_THEMES, OG_PICKER_THEME_META, OG_THEMES, OG_THEME_META, PendingBadgeComponent, PermissionGuard, PermissionService, PipelineStepperComponent, ProjectCardComponent, RadioButtonComponent, RadioButtonToggleComponent, RealtimeTableSync, RouteSkeletonComponent, SampleFrameComponent, ScoreBadgeComponent, ScreenshotFrameComponent, SearchBarComponent, SectionCardComponent, SegmentedComponent, SelectComponent, SeverityBadgesComponent, SkeletonDashboardComponent, SkeletonDetailComponent, SkeletonFacetsComponent, SkeletonFrameComponent, SkeletonListComponent, SliderComponent, SparkbarComponent, StageDotsComponent, StatCardsComponent, StatusDotComponent, SwitchComponent, TabComponent, TabGroupComponent, TableCell, TagComponent, ThemePickerComponent, ThemeService, ToastComponent, ToastContainerComponent, TranslationModule, TranslationService, TreeDiagram, TrimOnBlurDirective, UiModule, anyFeatureEnabled, countTone, createApi, featureEnabled, fxListResolver, fxMotionAllowed, fxRevealElement, scoreTone, severityTone, toneBadge, toneBadgeSolid, toneBg, toneBorder, toneColor, toneDot, toneDotChart, toneFg, toneScale, toneText, toneTint };
|
|
2789
|
+
export type { Breadcrumb, BreadcrumbOption, BreadcrumbSwitcher, ColumnChangedEvent, DrawerItem, ErrorMessages, FxApiClass, FxBarListItem, FxConfirmOptions, FxFacetGroup, FxFacetOption, FxFacetSelection, FxFeatureFlags, FxFilterChipOption, FxFilterPillOption, FxListRequest, FxListResolverContext, FxListRowBadge, FxLoadJob, FxMenuItem, FxPipelineStage, FxPipelineStageState, FxProjectCard, FxProjectCardChip, FxProjectCardMetric, FxSegmentedOption, FxSeverityBadge, FxSkeletonBlock, FxSkeletonBlockKind, FxSkeletonBlockSpec, FxSkeletonHint, FxStatCard, FxStatCardDelta, FxTableFilters, IRadioButton, KanbanColumn, NotificationCallback, NotificationConnectOptions, OgTheme, OgThemeMeta, RealtimeTableEvent, RealtimeTableSyncOptions, TableResult, TagType, ToastData, Tone, TreeNode, UploadResult };
|
package/utilities.css
CHANGED
|
@@ -40,5 +40,6 @@
|
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
@utility tag-common {
|
|
43
|
-
|
|
43
|
+
/* design .og-badge: 3px 10px (anh Tú 04/09: pills read too thin at 2px) */
|
|
44
|
+
@apply flex min-w-7 px-[10px] py-[3px] leading-5 hover:opacity-70 items-center justify-center;
|
|
44
45
|
}
|