@foxeltech/angular-ui 0.7.75 → 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 (31) hide show
  1. package/components.css +66 -3
  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 +641 -60
  7. package/fesm2022/foxeltech-angular-ui.mjs.map +1 -1
  8. package/package.json +3 -2
  9. package/src/lib/styles/components.css +66 -3
  10. package/src/lib/styles/utilities.css +8 -2
  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/pending-badge/pending-badge.component.html +2 -2
  20. package/src/lib/ui/components/project-card/project-card.component.html +7 -3
  21. package/src/lib/ui/components/route-skeleton/route-skeleton.component.css +1 -1
  22. package/src/lib/ui/components/sample-frame/sample-frame.component.html +6 -7
  23. package/src/lib/ui/components/section-card/section-card.component.html +3 -1
  24. package/src/lib/ui/components/segmented/segmented.component.html +6 -2
  25. package/src/lib/ui/components/severity-badges/severity-badges.component.html +1 -1
  26. package/src/lib/ui/components/stat-cards/stat-cards.component.css +18 -0
  27. package/src/lib/ui/components/stat-cards/stat-cards.component.html +3 -3
  28. package/types/foxeltech-angular-ui-chart.d.ts +18 -1
  29. package/types/foxeltech-angular-ui-flow.d.ts +7 -0
  30. package/types/foxeltech-angular-ui.d.ts +349 -14
  31. package/utilities.css +8 -2
@@ -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;
@@ -719,7 +784,23 @@ declare function toneBadge(tone: Tone | string | null | undefined): string;
719
784
  * nơi cần nhấn mạnh nhất; đừng dùng cho badge có chấm bên trong (chấm sẽ chìm).
720
785
  */
721
786
  declare function toneBadgeSolid(tone: Tone | string | null | undefined): string;
722
- /** Chỉ MÀU của tông, không kèm hình dạng pill — cho ô icon, chip, ô nền. */
787
+ /**
788
+ * Chỉ MÀU của tông, không kèm hình dạng pill — cho ô icon, chip, ô nền.
789
+ *
790
+ * ⚠️ Đây là họ SOLID: `tone-tint-critical` đặt `background: --og-text`
791
+ * (gần đen) VÀ `color: --og-surface` (trắng) trên CÙNG element.
792
+ *
793
+ * Hệ quả bắt buộc nhớ:
794
+ * 1. Chỉ dùng cho **badge một phần tử**. Với hộp nhiều dòng thì con sẽ cần màu
795
+ * chữ riêng, và nếu con ghi đè bằng `toneFg()` (đỏ sẫm) thì thành đỏ sẫm
796
+ * trên gần đen — không đọc được. Đã bị đúng vậy ở hộp RISK của
797
+ * `info-binary-detail` (anh Tú 03/09).
798
+ * 2. **KHÔNG** đặt `toneFg()` lên phần tử con của một phần tử đã có
799
+ * `toneTint()` — nó phá màu tương phản mà `toneTint` vừa đặt.
800
+ *
801
+ * Hộp/khối nhiều dòng thì dùng `toneScale()`: nền nhạt (color-mix 12%) + chữ
802
+ * đúng tông, con chỉ cần THỪA HƯỞNG.
803
+ */
723
804
  declare function toneTint(tone: Tone | string | null | undefined): string;
724
805
  /**
725
806
  * CHỮ theo tông — dùng thành viên dễ đọc nhất của mỗi họ severity, KHÔNG phải
@@ -918,10 +999,57 @@ declare class AuthInterceptor implements HttpInterceptor {
918
999
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AuthInterceptor>;
919
1000
  }
920
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
+ }
921
1040
  interface Breadcrumb {
922
1041
  label: string;
923
1042
  url?: string;
924
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;
925
1053
  }
926
1054
  declare class BreadcrumbService {
927
1055
  private breadcrumbs$;
@@ -1675,6 +1803,11 @@ declare class StatCardsComponent {
1675
1803
  readonly variant: _angular_core.InputSignal<"figure" | "tile">;
1676
1804
  /** Grid columns; defaults to one column per card. */
1677
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
+ */
1678
1811
  get gridColumns(): string;
1679
1812
  numClass(card: FxStatCard): string;
1680
1813
  boxClass(card: FxStatCard): string;
@@ -1742,6 +1875,12 @@ declare class FilterPillsComponent {
1742
1875
  /** Accepts undefined so screens can bind an optional filter-bag key. */
1743
1876
  readonly value: _angular_core.InputSignal<string | undefined>;
1744
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">;
1745
1884
  isActive(option: FxFilterPillOption): boolean;
1746
1885
  /**
1747
1886
  * Pill ĐANG CHỌN dùng **accent** (xanh), không phải nền đen — khớp demo:
@@ -1752,7 +1891,7 @@ declare class FilterPillsComponent {
1752
1891
  pillClass(option: FxFilterPillOption): string;
1753
1892
  countClass(option: FxFilterPillOption): string;
1754
1893
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FilterPillsComponent, never>;
1755
- 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>;
1756
1895
  }
1757
1896
 
1758
1897
  /**
@@ -1837,6 +1976,10 @@ declare class MeterComponent {
1837
1976
  * - titleStyle 'heading' (default): icon + heading, the pre-V2 look
1838
1977
  * - titleStyle 'eyebrow': the V2 design's panel header — small tracked
1839
1978
  * caption on the left, muted [aside] text on the right
1979
+ *
1980
+ * The host is a flex column (not the custom element's inline default) so that
1981
+ * in a CSS grid row every card stretches to the row height and panels line up
1982
+ * (anh Tú 04/09); a footer projected with `mt-auto` sticks to the bottom.
1840
1983
  */
1841
1984
  declare class SectionCardComponent {
1842
1985
  /** Caller-translated heading. */
@@ -1946,19 +2089,33 @@ declare class MasterDetailComponent implements AfterViewInit, AfterContentInit {
1946
2089
  /** Caller-translated Prev/Next labels ("X of Y" is numeric). */
1947
2090
  readonly prevLabel: _angular_core.InputSignal<string>;
1948
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>;
1949
2106
  readonly rowTemplate: _angular_core.Signal<TemplateRef<any>>;
1950
2107
  readonly detailTemplate: _angular_core.Signal<TemplateRef<any>>;
1951
2108
  readonly paginator: _angular_core.Signal<MatPaginator>;
1952
2109
  readonly uid: string;
1953
2110
  ngAfterContentInit(): void;
1954
2111
  ngAfterViewInit(): void;
1955
- /** "X of Y" range text for the prevnext pagination style. */
2112
+ /** "Page X of Y" for the prevnext pagination style (design 11/14/17). */
1956
2113
  rangeText(): string;
1957
2114
  isSelected(row: any): boolean;
1958
2115
  optionId(index: number): string;
1959
2116
  onKeydown(event: KeyboardEvent, index: number): void;
1960
2117
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MasterDetailComponent, never>;
1961
- 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>;
1962
2119
  }
1963
2120
 
1964
2121
  interface FxMenuItem {
@@ -2023,6 +2180,7 @@ declare class ThemePickerComponent {
2023
2180
  * <fx-ui-pending-badge [field]="'confirmed-chains weekly series'" />
2024
2181
  *
2025
2182
  * Keep the copy factual: it states that data is missing, never fakes a value.
2183
+ * Styling is neutral on purpose (anh Tú 04/09): a hint, not a warning.
2026
2184
  */
2027
2185
  declare class PendingBadgeComponent {
2028
2186
  /** Caller-translated chip text. */
@@ -2039,15 +2197,90 @@ declare class PendingBadgeComponent {
2039
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>;
2040
2198
  }
2041
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
+
2042
2274
  /**
2043
2275
  * Wraps UI that is rendered from PLACEHOLDER data so the layout can be
2044
2276
  * reviewed before its endpoint exists (anh Tú 29/08: "muốn có full giao diện
2045
2277
  * trước để review").
2046
2278
  *
2047
- * The frame makes the status unmistakable dashed outline, a corner label and
2048
- * the pending marker naming the missing field so sample shapes can never be
2049
- * mistaken for measured values. Drop the wrapper (and the sample input) the
2050
- * moment the API lands.
2279
+ * The marker is deliberately quiet (anh 04/09: no yellow frame, just a
2280
+ * subtle "Pending API" chip): a neutral chip above the block, with the label
2281
+ * and missing field in its tooltip. The content itself is non-interactive so
2282
+ * sample shapes are never mistaken for live state. Drop the wrapper (and the
2283
+ * sample input) the moment the API lands.
2051
2284
  *
2052
2285
  * The pending chip is inlined rather than composed from fx-ui-pending-badge:
2053
2286
  * one lib component importing another inside the same barrel tripped NG0919
@@ -2058,7 +2291,7 @@ declare class PendingBadgeComponent {
2058
2291
  * </fx-ui-sample-frame>
2059
2292
  */
2060
2293
  declare class SampleFrameComponent {
2061
- /** Caller-translated corner label. */
2294
+ /** Caller-translated block label — surfaces in the chip tooltip only. */
2062
2295
  readonly label: _angular_core.InputSignal<string>;
2063
2296
  /** Field the backend still owes — shown on the pending badge tooltip. */
2064
2297
  readonly field: _angular_core.InputSignal<string>;
@@ -2156,17 +2389,29 @@ declare class SegmentedComponent {
2156
2389
  * (design refs 04/05).
2157
2390
  */
2158
2391
  readonly variant: _angular_core.InputSignal<"default" | "pill">;
2392
+ /**
2393
+ * 'equal' (default): every segment takes the same width (view toggles such
2394
+ * as Catalog | Table). 'content': each segment is as wide as its label —
2395
+ * the demo's detail-pane tabs ("Affected software · Summary · Evidence"),
2396
+ * where equal columns would truncate the long label in a narrow pane.
2397
+ */
2398
+ readonly fit: _angular_core.InputSignal<"content" | "equal">;
2399
+ private readonly optionEls;
2400
+ /** Measured box of the active segment — only used when fit === 'content'. */
2401
+ private readonly thumbBox;
2402
+ constructor();
2159
2403
  /** Index the sliding thumb sits on; -1 hides it (no/unknown selection). */
2160
2404
  readonly activeIndex: _angular_core.Signal<number>;
2161
2405
  /** Equal-width tracks → the thumb is 1/n of the inner width and slides by
2162
2406
  * multiples of its own width. Pure CSS transform, nothing to measure. */
2163
2407
  readonly thumbWidth: _angular_core.Signal<string>;
2164
2408
  readonly thumbTransform: _angular_core.Signal<string>;
2409
+ readonly gridClass: _angular_core.Signal<"auto-cols-auto" | "auto-cols-fr">;
2165
2410
  select(option: FxSegmentedOption): void;
2166
2411
  thumbClass(): string;
2167
2412
  optionClass(option: FxSegmentedOption): string;
2168
2413
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SegmentedComponent, never>;
2169
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SegmentedComponent, "fx-ui-segmented", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
2414
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SegmentedComponent, "fx-ui-segmented", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "fit": { "alias": "fit"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
2170
2415
  }
2171
2416
 
2172
2417
  interface FxListRowBadge {
@@ -2433,6 +2678,80 @@ declare class ConfirmationDialogComponent {
2433
2678
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ConfirmationDialogComponent, "fx-ui-confirmation-dialog", never, {}, {}, never, never, true, never>;
2434
2679
  }
2435
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
+
2436
2755
  /**
2437
2756
  * Compatibility barrel over the (now standalone) core components.
2438
2757
  *
@@ -2446,9 +2765,25 @@ declare class ConfirmationDialogComponent {
2446
2765
  */
2447
2766
  declare class UiModule {
2448
2767
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiModule, never>;
2449
- 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]>;
2450
2769
  static ɵinj: _angular_core.ɵɵInjectorDeclaration<UiModule>;
2451
2770
  }
2452
2771
 
2453
- 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 };
2454
- 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
@@ -31,9 +31,15 @@
31
31
  }
32
32
 
33
33
  @utility card-common {
34
- @apply text-left px-xl py-large border border-border-default rounded-lg shadow-sm transition-colors duration-500 ease-in-out;
34
+ @apply text-left px-xl py-large border border-border-default rounded-lg transition-colors duration-500 ease-in-out;
35
+ /* Demo `.og-panel` / `.og-statgrid`: hairline border + two soft layers.
36
+ Replaces Tailwind shadow-sm, which reads harder at the edges. */
37
+ box-shadow:
38
+ 0 1px 2px rgb(0 0 0 / 0.04),
39
+ 0 3px 8px rgb(0 0 0 / 0.05);
35
40
  }
36
41
 
37
42
  @utility tag-common {
38
- @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;
39
45
  }