@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.
Files changed (27) hide show
  1. package/components.css +40 -1
  2. package/fesm2022/foxeltech-angular-ui-chart.mjs +33 -3
  3. package/fesm2022/foxeltech-angular-ui-chart.mjs.map +1 -1
  4. package/fesm2022/foxeltech-angular-ui-flow.mjs +42 -5
  5. package/fesm2022/foxeltech-angular-ui-flow.mjs.map +1 -1
  6. package/fesm2022/foxeltech-angular-ui.mjs +559 -42
  7. package/fesm2022/foxeltech-angular-ui.mjs.map +1 -1
  8. package/package.json +3 -2
  9. package/src/lib/styles/components.css +40 -1
  10. package/src/lib/styles/utilities.css +2 -1
  11. package/src/lib/ui/components/breadcrumb/breadcrumb.component.css +262 -0
  12. package/src/lib/ui/components/breadcrumb/breadcrumb.component.html +91 -0
  13. package/src/lib/ui/components/button/button.component.html +1 -0
  14. package/src/lib/ui/components/filter-pills/filter-pills.component.html +1 -1
  15. package/src/lib/ui/components/load-status/load-status.component.css +96 -0
  16. package/src/lib/ui/components/load-status/load-status.component.html +20 -0
  17. package/src/lib/ui/components/master-detail/master-detail.component.css +63 -11
  18. package/src/lib/ui/components/master-detail/master-detail.component.html +71 -42
  19. package/src/lib/ui/components/route-skeleton/route-skeleton.component.css +1 -1
  20. package/src/lib/ui/components/segmented/segmented.component.html +3 -1
  21. package/src/lib/ui/components/severity-badges/severity-badges.component.html +1 -1
  22. package/src/lib/ui/components/stat-cards/stat-cards.component.css +18 -0
  23. package/src/lib/ui/components/stat-cards/stat-cards.component.html +3 -3
  24. package/types/foxeltech-angular-ui-chart.d.ts +18 -1
  25. package/types/foxeltech-angular-ui-flow.d.ts +7 -0
  26. package/types/foxeltech-angular-ui.d.ts +309 -8
  27. 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
- paginator: MatPaginator;
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" range text for the prevnext pagination style. */
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<"equal" | "content">;
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
- export { AuthInterceptor, AuthStateService, BarListComponent, BaseComponent, BaseDialogComponent, BaseMasterDetailComponent, BaseTableComponent, BreadcrumbService, ButtonComponent, CheckboxComponent, CircleProgressBar, CodeBlockComponent, ConfirmationDialogComponent, DatetimePicker, DndUploadComponent, DrawerComponent, EmptyStateComponent, FX_ICON_SPRITE_URL, FX_SKELETON_DATA_KEY, FacetsRailComponent, FilterChipsComponent, FilterPillsComponent, FxComponent, FxDialogService, FxLoadingService, FxRouteSkeletonService, FxStorageService, FxToastrService, FxUtils, FxValidators, HasPermissionDirective, HeroIconComponent, HttpLoaderFactory, HttpWrapper, InfoFieldComponent, InputComponent, KanbanBoardComponent, ListRowComponent, 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, scoreTone, severityTone, toneBadge, toneBadgeSolid, toneBg, toneBorder, toneColor, toneDot, toneDotChart, toneFg, toneScale, toneText, toneTint };
2488
- export type { Breadcrumb, ColumnChangedEvent, DrawerItem, ErrorMessages, FxApiClass, FxBarListItem, FxConfirmOptions, FxFacetGroup, FxFacetOption, FxFacetSelection, FxFeatureFlags, FxFilterChipOption, FxFilterPillOption, FxListRequest, FxListResolverContext, FxListRowBadge, 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 };
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
- @apply flex min-w-7 px-[10px] py-[2px] leading-5 hover:opacity-70 items-center justify-center;
43
+ /* design .og-badge: 3px 10px (anh 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
  }