@foxeltech/angular-ui 0.0.14 → 0.3.0

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 (134) hide show
  1. package/BeVietnamPro/BeVietnamPro-Bold.woff2 +0 -0
  2. package/BeVietnamPro/BeVietnamPro-ExtraLight.woff2 +0 -0
  3. package/BeVietnamPro/BeVietnamPro-Light.woff2 +0 -0
  4. package/BeVietnamPro/BeVietnamPro-Medium.woff2 +0 -0
  5. package/BeVietnamPro/BeVietnamPro-Regular.woff2 +0 -0
  6. package/BeVietnamPro/BeVietnamPro-SemiBold.woff2 +0 -0
  7. package/BeVietnamPro/BeVietnamPro-Thin.woff2 +0 -0
  8. package/SpaceMono-Regular.woff2 +0 -0
  9. package/components.css +7 -17
  10. package/dm-sans/DMSans-Bold.woff2 +0 -0
  11. package/dm-sans/DMSans-Light.woff2 +0 -0
  12. package/dm-sans/DMSans-Medium.woff2 +0 -0
  13. package/dm-sans/DMSans-Regular.woff2 +0 -0
  14. package/dm-sans/DMSans-SemiBold.woff2 +0 -0
  15. package/dm-sans/DMSans-Thin.woff2 +0 -0
  16. package/fesm2022/foxeltech-angular-ui.mjs +1349 -285
  17. package/fesm2022/foxeltech-angular-ui.mjs.map +1 -1
  18. package/fonts.css +68 -34
  19. package/index.d.ts +624 -139
  20. package/orbitron/Orbitron-Bold.woff2 +0 -0
  21. package/orbitron/Orbitron-Medium.woff2 +0 -0
  22. package/orbitron/Orbitron-Regular.woff2 +0 -0
  23. package/orbitron/Orbitron-SemiBold.woff2 +0 -0
  24. package/package.json +9 -10
  25. package/roboto/Roboto-Black.woff2 +0 -0
  26. package/roboto/Roboto-BlackItalic.woff2 +0 -0
  27. package/roboto/Roboto-Bold.woff2 +0 -0
  28. package/roboto/Roboto-BoldCondensed.woff2 +0 -0
  29. package/roboto/Roboto-BoldCondensedItalic.woff2 +0 -0
  30. package/roboto/Roboto-BoldItalic.woff2 +0 -0
  31. package/roboto/Roboto-Condensed.woff2 +0 -0
  32. package/roboto/Roboto-CondensedItalic.woff2 +0 -0
  33. package/roboto/Roboto-Italic.woff2 +0 -0
  34. package/roboto/Roboto-Light.woff2 +0 -0
  35. package/roboto/Roboto-LightItalic.woff2 +0 -0
  36. package/roboto/Roboto-Medium.woff2 +0 -0
  37. package/roboto/Roboto-MediumItalic.woff2 +0 -0
  38. package/roboto/Roboto-Regular.woff2 +0 -0
  39. package/roboto/Roboto-Thin.woff2 +0 -0
  40. package/roboto/Roboto-ThinItalic.woff2 +0 -0
  41. package/src/lib/styles/components.css +7 -17
  42. package/src/lib/styles/fonts.css +68 -34
  43. package/src/lib/styles/tailwind.css +11 -8
  44. package/src/lib/styles/tokens.css +131 -0
  45. package/src/lib/styles/utilities.css +24 -0
  46. package/src/lib/ui/components/button/button.component.html +4 -1
  47. package/src/lib/ui/components/button/button.component.scss +0 -0
  48. package/src/lib/ui/components/chart/chart.component.scss +49 -0
  49. package/src/lib/ui/components/checkbox/checkbox.component.html +3 -2
  50. package/src/lib/ui/components/checkbox/checkbox.component.scss +0 -0
  51. package/src/lib/ui/components/circle-progress-bar/circle-progress-bar.component.scss +0 -0
  52. package/src/lib/ui/components/datetime-picker/datetime-picker.component.html +3 -2
  53. package/src/lib/ui/components/datetime-picker/datetime-picker.component.scss +147 -0
  54. package/src/lib/ui/components/dnd-upload/dnd-upload.component.scss +87 -0
  55. package/src/lib/ui/components/drawer/drawer.component.html +3 -0
  56. package/src/lib/ui/components/drawer/drawer.component.scss +134 -0
  57. package/src/lib/ui/components/empty-state/empty-state.component.html +9 -0
  58. package/src/lib/ui/components/filter-chips/filter-chips.component.html +12 -0
  59. package/src/lib/ui/components/flow-connection/flow-connection.component.scss +0 -0
  60. package/src/lib/ui/components/hero-icon/hero-icon.component.scss +0 -0
  61. package/src/lib/ui/components/info-field/info-field.component.html +4 -0
  62. package/src/lib/ui/components/input/input.component.html +15 -3
  63. package/src/lib/ui/components/kanban-board/kanban-board.component.scss +70 -0
  64. package/src/lib/ui/components/loading-panel/loading-panel.component.scss +0 -0
  65. package/src/lib/ui/components/master-detail/master-detail.component.css +11 -0
  66. package/src/lib/ui/components/master-detail/master-detail.component.html +70 -0
  67. package/src/lib/ui/components/meter/meter.component.html +22 -0
  68. package/src/lib/ui/components/radio-button/radio-button.component.html +10 -4
  69. package/src/lib/ui/components/radio-button-toggle/radio-button-toggle.component.html +8 -3
  70. package/src/lib/ui/components/radio-button-toggle/radio-button-toggle.component.scss +0 -0
  71. package/src/lib/ui/components/rich-text-area/rich-text-area.component.scss +18 -0
  72. package/src/lib/ui/components/search-bar/search-bar.component.scss +0 -0
  73. package/src/lib/ui/components/section-card/section-card.component.html +9 -0
  74. package/src/lib/ui/components/select/select.component.html +9 -4
  75. package/src/lib/ui/components/severity-badges/severity-badges.component.html +11 -0
  76. package/src/lib/ui/components/skeleton-detail/skeleton-detail.component.html +22 -0
  77. package/src/lib/ui/components/skeleton-list/skeleton-list.component.html +12 -0
  78. package/src/lib/ui/components/skeleton-table-loading/skeleton-table-loading.component.scss +0 -0
  79. package/src/lib/ui/components/slider/slider.component.html +3 -0
  80. package/src/lib/ui/components/slider/slider.component.scss +0 -0
  81. package/src/lib/ui/components/stat-cards/stat-cards.component.html +18 -0
  82. package/src/lib/ui/components/switch/switch.component.html +11 -6
  83. package/src/lib/ui/components/switch/switch.component.scss +0 -0
  84. package/src/lib/ui/components/tab-component/tab.component.scss +0 -0
  85. package/src/lib/ui/components/tab-group/tab-group.component.html +15 -1
  86. package/src/lib/ui/components/tab-group/tab-group.component.scss +51 -0
  87. package/src/lib/ui/components/table-cell/table-cell.component.scss +0 -0
  88. package/src/lib/ui/components/tag/tag.component.html +6 -1
  89. package/src/lib/ui/components/tag/tag.component.scss +0 -0
  90. package/src/lib/ui/components/toast/toast.component.html +2 -1
  91. package/src/lib/ui/components/toast/toast.component.scss +0 -0
  92. package/src/lib/ui/components/toast-container/toast-container.component.scss +0 -0
  93. package/src/lib/ui/components/tree-diagram/tree-diagram.component.scss +0 -0
  94. package/src/lib/ui/dialogs/confirmation/confirmation.component.html +1 -1
  95. package/src/lib/ui/dialogs/confirmation/confirmation.component.scss +0 -0
  96. package/tailwind.css +11 -8
  97. package/tokens.css +131 -0
  98. package/utilities.css +24 -0
  99. package/BeVietnamPro/BeVietnamPro-Bold.ttf +0 -0
  100. package/BeVietnamPro/BeVietnamPro-ExtraLight.ttf +0 -0
  101. package/BeVietnamPro/BeVietnamPro-Light.ttf +0 -0
  102. package/BeVietnamPro/BeVietnamPro-Medium.ttf +0 -0
  103. package/BeVietnamPro/BeVietnamPro-Regular.ttf +0 -0
  104. package/BeVietnamPro/BeVietnamPro-SemiBold.ttf +0 -0
  105. package/BeVietnamPro/BeVietnamPro-Thin.ttf +0 -0
  106. package/SpaceMono-Regular.ttf +0 -0
  107. package/dm-sans/DMSans-Bold.ttf +0 -0
  108. package/dm-sans/DMSans-Light.ttf +0 -0
  109. package/dm-sans/DMSans-Medium.ttf +0 -0
  110. package/dm-sans/DMSans-Regular.ttf +0 -0
  111. package/dm-sans/DMSans-SemiBold.ttf +0 -0
  112. package/dm-sans/DMSans-Thin.ttf +0 -0
  113. package/orbitron/Orbitron-Bold.ttf +0 -0
  114. package/orbitron/Orbitron-Medium.ttf +0 -0
  115. package/orbitron/Orbitron-Regular.ttf +0 -0
  116. package/orbitron/Orbitron-SemiBold.ttf +0 -0
  117. package/roboto/Roboto-Black.ttf +0 -0
  118. package/roboto/Roboto-BlackItalic.ttf +0 -0
  119. package/roboto/Roboto-Bold.ttf +0 -0
  120. package/roboto/Roboto-BoldCondensed.ttf +0 -0
  121. package/roboto/Roboto-BoldCondensedItalic.ttf +0 -0
  122. package/roboto/Roboto-BoldItalic.ttf +0 -0
  123. package/roboto/Roboto-Condensed.ttf +0 -0
  124. package/roboto/Roboto-CondensedItalic.ttf +0 -0
  125. package/roboto/Roboto-Italic.ttf +0 -0
  126. package/roboto/Roboto-Light.ttf +0 -0
  127. package/roboto/Roboto-LightItalic.ttf +0 -0
  128. package/roboto/Roboto-Medium.ttf +0 -0
  129. package/roboto/Roboto-MediumItalic.ttf +0 -0
  130. package/roboto/Roboto-Regular.ttf +0 -0
  131. package/roboto/Roboto-Thin.ttf +0 -0
  132. package/roboto/Roboto-ThinItalic.ttf +0 -0
  133. package/tailwind-config.d.ts +0 -4
  134. package/tailwind.config.js +0 -95
package/index.d.ts CHANGED
@@ -1,50 +1,52 @@
1
1
  import * as i0 from '@angular/core';
2
- import { OnDestroy, Injector, ApplicationRef, OnInit, AfterViewInit, ChangeDetectorRef, Type, EventEmitter, ModuleWithProviders, TemplateRef, ViewContainerRef, ElementRef, RendererFactory2, OnChanges, SimpleChanges, AfterContentInit, QueryList, Renderer2, NgZone } from '@angular/core';
2
+ import { OnDestroy, Injector, DestroyRef, ApplicationRef, OnInit, AfterViewInit, ChangeDetectorRef, Type, EventEmitter, Provider, ModuleWithProviders, TemplateRef, ViewContainerRef, ElementRef, RendererFactory2, OnChanges, SimpleChanges, AfterContentInit, QueryList, Renderer2, NgZone } from '@angular/core';
3
3
  import * as _foxeltech_angular_ui from '@foxeltech/angular-ui';
4
- import * as i43 from '@angular/material/paginator';
4
+ import * as i53 from '@angular/material/paginator';
5
5
  import { MatPaginator } from '@angular/material/paginator';
6
- import * as i44 from '@angular/material/table';
6
+ import * as i54 from '@angular/material/table';
7
7
  import { MatTableDataSource, MatTable } from '@angular/material/table';
8
8
  import { HttpClient, HttpEvent, HttpErrorResponse, HttpInterceptor, HttpRequest, HttpHandler } from '@angular/common/http';
9
9
  import * as rxjs from 'rxjs';
10
10
  import { Observable, Subject } from 'rxjs';
11
- import * as i30 from '@angular/forms';
11
+ import * as i40 from '@angular/forms';
12
12
  import { NgForm, ValidationErrors, NgControl, ControlValueAccessor } from '@angular/forms';
13
- import * as i46 from '@angular/material/dialog';
13
+ import * as i56 from '@angular/material/dialog';
14
14
  import { MatDialogRef, MatDialog } from '@angular/material/dialog';
15
+ import * as i41 from '@angular/router';
16
+ import { ActivatedRouteSnapshot, RouterStateSnapshot, ResolveFn, CanActivate, Router } from '@angular/router';
15
17
  import { TranslateHttpLoader } from '@ngx-translate/http-loader';
16
18
  import * as i1 from '@ngx-translate/core';
17
19
  import { TranslateService } from '@ngx-translate/core';
18
- import * as i31 from '@angular/router';
19
- import { CanActivate, Router } from '@angular/router';
20
20
  import { EChartsOption, ECharts } from 'echarts';
21
- import * as i37 from 'ngx-vflow';
21
+ import * as i47 from 'ngx-vflow';
22
22
  import { Node, Edge, Connection } from 'ngx-vflow';
23
- import * as i56 from '@angular/cdk/drag-drop';
23
+ import * as i66 from '@angular/cdk/drag-drop';
24
24
  import { CdkDragDrop } from '@angular/cdk/drag-drop';
25
- import * as i29 from '@angular/common';
26
- import * as i32 from '@danielmoncada/angular-datetime-picker';
27
- import * as i33 from '@danielmoncada/angular-datetime-picker-moment-adapter';
28
- import * as i36 from '@dimaslz/ng-heroicons';
29
- import * as i38 from 'ngx-echarts';
30
- import * as i39 from '@angular/material/select';
31
- import * as i40 from '@angular/material/radio';
32
- import * as i41 from '@angular/material/button';
33
- import * as i42 from '@angular/material/icon';
34
- import * as i45 from '@angular/material/snack-bar';
35
- import * as i47 from '@angular/material/checkbox';
36
- import * as i48 from '@angular/material/card';
37
- import * as i49 from '@angular/material/datepicker';
38
- import * as i50 from '@angular/material/timepicker';
39
- import * as i51 from '@angular/material/badge';
40
- import * as i52 from '@angular/material/expansion';
41
- import * as i53 from '@angular/material/form-field';
42
- import * as i54 from '@angular/material/menu';
43
- import * as i55 from '@angular/material/tooltip';
25
+ import * as i39 from '@angular/common';
26
+ import * as i42 from '@danielmoncada/angular-datetime-picker';
27
+ import * as i43 from '@danielmoncada/angular-datetime-picker-moment-adapter';
28
+ import * as i46 from '@dimaslz/ng-heroicons';
29
+ import * as i48 from 'ngx-echarts';
30
+ import * as i49 from '@angular/material/select';
31
+ import * as i50 from '@angular/material/radio';
32
+ import * as i51 from '@angular/material/button';
33
+ import * as i52 from '@angular/material/icon';
34
+ import * as i55 from '@angular/material/snack-bar';
35
+ import * as i57 from '@angular/material/checkbox';
36
+ import * as i58 from '@angular/material/card';
37
+ import * as i59 from '@angular/material/datepicker';
38
+ import * as i60 from '@angular/material/timepicker';
39
+ import * as i61 from '@angular/material/badge';
40
+ import * as i62 from '@angular/material/expansion';
41
+ import * as i63 from '@angular/material/form-field';
42
+ import * as i64 from '@angular/material/menu';
43
+ import * as i65 from '@angular/material/tooltip';
44
44
 
45
45
  declare abstract class BaseComponent implements OnDestroy {
46
46
  protected injector: Injector;
47
- constructor(injector: Injector);
47
+ /** Teardown hook for subscriptions: takeUntilDestroyed(this.destroyRef). */
48
+ protected destroyRef: DestroyRef;
49
+ constructor(injector?: Injector);
48
50
  ngOnDestroy(): void;
49
51
  static ɵfac: i0.ɵɵFactoryDeclaration<BaseComponent, never>;
50
52
  static ɵdir: i0.ɵɵDirectiveDeclaration<BaseComponent, never, never, {}, {}, never, never, true, never>;
@@ -54,6 +56,13 @@ declare class HttpWrapper {
54
56
  http: HttpClient;
55
57
  baseURL: string;
56
58
  constructor(http: HttpClient, baseURL: string);
59
+ /**
60
+ * Hook applied to every resolved response (get/post/put/delete and all verb
61
+ * helpers built on them). Default is identity; override to normalize a
62
+ * backend convention once (e.g. FxUtils.camelizeDeep for snake_case +
63
+ * protobuf-Long payloads) instead of wrapping each method.
64
+ */
65
+ protected transformResponse(res: any): any;
57
66
  private addCredentials;
58
67
  get(url?: string, params?: any): Promise<any>;
59
68
  post(url: string, body?: any, options?: any): Promise<any>;
@@ -122,6 +131,7 @@ declare class BaseTableComponent<T = any> extends BaseComponent implements OnIni
122
131
  create?: {
123
132
  dialog?: Type<{}>;
124
133
  size?: string;
134
+ disableClose?: boolean;
125
135
  label?: string;
126
136
  title?: string;
127
137
  message?: string;
@@ -129,6 +139,7 @@ declare class BaseTableComponent<T = any> extends BaseComponent implements OnIni
129
139
  update?: {
130
140
  dialog?: Type<{}>;
131
141
  size?: string;
142
+ disableClose?: boolean;
132
143
  label?: string;
133
144
  title?: string;
134
145
  message?: string;
@@ -136,6 +147,7 @@ declare class BaseTableComponent<T = any> extends BaseComponent implements OnIni
136
147
  view?: {
137
148
  dialog?: Type<{}>;
138
149
  size?: string;
150
+ disableClose?: boolean;
139
151
  label?: string;
140
152
  title?: string;
141
153
  message?: string;
@@ -158,7 +170,21 @@ declare class BaseTableComponent<T = any> extends BaseComponent implements OnIni
158
170
  init(): void;
159
171
  ngAfterViewInit(): void;
160
172
  refresh(): Promise<void>;
173
+ /**
174
+ * Where the list is fetched from. Default (null) keeps the legacy behavior
175
+ * of calling `api.search()` (GET /search) untouched. Subclasses whose list
176
+ * lives elsewhere override this instead of re-implementing fetch() — and
177
+ * keep the stale-response sequence guard for free.
178
+ */
179
+ protected listRequest(): {
180
+ method: 'get' | 'post';
181
+ url: string;
182
+ } | null;
183
+ /** Result keys the list/total are read from. Override alongside listRequest(). */
184
+ protected listKey: string;
185
+ protected totalKey: string;
161
186
  setDataSource(result: any): void;
187
+ private _fetchSeq;
162
188
  fetch(): Promise<void>;
163
189
  onPageChange(event: any): Promise<void>;
164
190
  resolve(): {};
@@ -178,6 +204,40 @@ declare class BaseTableComponent<T = any> extends BaseComponent implements OnIni
178
204
  static ɵdir: i0.ɵɵDirectiveDeclaration<BaseTableComponent<any>, never, never, {}, {}, never, never, true, never>;
179
205
  }
180
206
 
207
+ /**
208
+ * List + detail-pane counterpart of BaseTableComponent: the page keeps a
209
+ * selectable row list on one side and a lazily fetched, per-id-cached detail
210
+ * on the other. Pair it with `<fx-ui-master-detail>` which renders the
211
+ * two-column shell from this state.
212
+ *
213
+ * Subclasses declare where ids and details come from:
214
+ * protected override idKey = 'licenseId';
215
+ * protected override detailUrl(id: string) { return `/license/${id}`; }
216
+ * `detailUrl` returning null (the default) means the selected row itself is
217
+ * the detail and no request is made.
218
+ */
219
+ declare class BaseMasterDetailComponent<T = any> extends BaseTableComponent<T> {
220
+ selectedId: string | null;
221
+ selected: T | null;
222
+ detailMap: Map<string, any>;
223
+ detailLoading: Set<string>;
224
+ constructor(injector: Injector, api: HttpWrapper, modal: any, ref: ChangeDetectorRef);
225
+ /** Key the row id is read from. Override idOf() instead for composite ids. */
226
+ protected idKey: string;
227
+ idOf(row: any): string | null;
228
+ protected detailUrl(id: string): string | null;
229
+ /** What the detail pane shows: the fetched detail when cached, else the row. */
230
+ get detail(): any;
231
+ get detailBusy(): boolean;
232
+ setDataSource(result: any): void;
233
+ /** Keep the previous selection when it survived the new page, else pick row 0. */
234
+ autoSelectFirst(): void;
235
+ selectItem(row: T): void;
236
+ fetchDetail(id: string): void;
237
+ static ɵfac: i0.ɵɵFactoryDeclaration<BaseMasterDetailComponent<any>, never>;
238
+ static ɵdir: i0.ɵɵDirectiveDeclaration<BaseMasterDetailComponent<any>, never, never, {}, {}, never, never, true, never>;
239
+ }
240
+
181
241
  declare class BaseDialogComponent<T = any> extends BaseComponent implements AfterViewInit, OnInit {
182
242
  ref: MatDialogRef<any>;
183
243
  bindings: any;
@@ -225,9 +285,205 @@ declare class BaseResolver {
225
285
  baseResolverInit(): void;
226
286
  }
227
287
 
288
+ interface FxListRequest {
289
+ /** Defaults to 'get'. */
290
+ method?: 'get' | 'post';
291
+ url: string;
292
+ /** Query params (get) — for post they are sent as the body unless `body` is set. */
293
+ params?: any;
294
+ body?: any;
295
+ }
296
+ interface FxListResolverContext {
297
+ /** Page size remembered for this route url (FxStorageService convention), default 10. */
298
+ pageSize: number;
299
+ }
300
+ /**
301
+ * Functional replacement for the copy-pasted list-resolver class:
302
+ * starts the loading overlay, runs one API request, and on failure stops the
303
+ * overlay and shows a parsed error toast — the exact convention every
304
+ * BaseResolver subclass hand-rolls today. BaseResolver stays for existing
305
+ * classes; new routes should use this factory.
306
+ *
307
+ * Usage:
308
+ * resolve: { histories: fxListResolver(ScanManagementApi, (route, state, ctx) =>
309
+ * ({ url: `/${route.paramMap.get('id')}/history`, params: { page: 1, pageSize: ctx.pageSize } })) }
310
+ */
311
+ declare function fxListResolver<A extends HttpWrapper>(apiType: Type<A>, request: (route: ActivatedRouteSnapshot, state: RouterStateSnapshot, ctx: FxListResolverContext) => FxListRequest): ResolveFn<any>;
312
+
313
+ type FxApiClass = Type<HttpWrapper> & {
314
+ provider: Provider;
315
+ };
316
+ /**
317
+ * Factory for the 11-line HttpWrapper subclasses copy-pasted per endpoint.
318
+ * Returns a distinct injectable class per call (so constructor injection by
319
+ * type keeps working) without needing a decorator:
320
+ *
321
+ * export const ScanManagementApi = createApi(() => `${environment.baseService}/scarf/scan`);
322
+ * // module: providers: [ScanManagementApi.provider]
323
+ * // usage: constructor(private api: InstanceType<typeof ScanManagementApi>)
324
+ *
325
+ * `baseURL` accepts a string or a lazy factory (for environment-derived URLs).
326
+ * An optional `transform` plugs into HttpWrapper.transformResponse — e.g.
327
+ * FxUtils.camelizeDeep for snake_case/Long-encoded backends.
328
+ *
329
+ * IMPORTANT — when subclassing (`@Injectable() class X extends createApi(...)`),
330
+ * declare an explicit `constructor(http: HttpClient) { super(http); }`.
331
+ * The generated base carries no Angular factory metadata, so an inherited
332
+ * constructor makes Ivy fall back to `new X()` with NO arguments: the class
333
+ * silently gets `http = undefined` and every call fails at runtime while the
334
+ * build stays green.
335
+ */
336
+ declare function createApi(baseURL: string | (() => string), transform?: (res: any) => any): FxApiClass;
337
+
338
+ type NotificationCallback = (...args: any[]) => void;
339
+ interface NotificationConnectOptions {
340
+ headers?: any;
341
+ accessTokenFactory?: () => string | Promise<string>;
342
+ }
343
+ declare class NotificationService {
344
+ private hubConnection;
345
+ private connectionStatus;
346
+ /**
347
+ * Single source of truth for subscriptions. The hub connection gets exactly
348
+ * one dispatcher per event, so:
349
+ * - off(event, callback) can remove one subscriber without nuking the rest
350
+ * (hubConnection.off(event) removes every handler for the event);
351
+ * - handlers registered before connect() are attached once connected;
352
+ * - handlers survive a re-connect that builds a new HubConnection.
353
+ */
354
+ private handlers;
355
+ private connectPromise;
356
+ private lastHubUrl;
357
+ private lastOptions?;
358
+ private manualDisconnect;
359
+ private restartAttempts;
360
+ private restartTimer;
361
+ /**
362
+ * Connect to SignalR Hub. Overlapping calls share the same in-flight
363
+ * promise instead of building two competing connections.
364
+ */
365
+ connect(hubUrl: string, options?: NotificationConnectOptions): Promise<void>;
366
+ private doConnect;
367
+ private scheduleRestart;
368
+ /**
369
+ * Disconnect from SignalR Hub. Stops any pending auto-restart.
370
+ */
371
+ disconnect(): Promise<void>;
372
+ /**
373
+ * Listen to a specific event from the server. Safe to call before
374
+ * connect(): the handler is attached once the connection is up.
375
+ */
376
+ on(eventName: string, callback: NotificationCallback): void;
377
+ /**
378
+ * Remove listener(s) for an event.
379
+ * Prefer passing the callback (or using on$()): calling off(event) without
380
+ * one removes EVERY handler for the event, including other features'.
381
+ */
382
+ off(eventName: string, callback?: NotificationCallback): void;
383
+ /**
384
+ * Observable stream of an event. Teardown removes exactly this
385
+ * subscriber — the safe replacement for manual on()/off().
386
+ * Emits the event's first argument (SignalR payloads are single-arg here).
387
+ */
388
+ on$<T = any>(eventName: string): Observable<T>;
389
+ private attachDispatcher;
390
+ private dispatch;
391
+ /**
392
+ * Invoke a method on the server
393
+ * @param methodName - Name of the method to invoke
394
+ * @param args - Arguments to pass to the method
395
+ */
396
+ invoke(methodName: string, ...args: any[]): Promise<any>;
397
+ /**
398
+ * Get current connection status
399
+ */
400
+ getConnectionStatus(): 'disconnected' | 'connecting' | 'connected';
401
+ /**
402
+ * Get connection ID
403
+ */
404
+ getConnectionId(): string | null;
405
+ static ɵfac: i0.ɵɵFactoryDeclaration<NotificationService, never>;
406
+ static ɵprov: i0.ɵɵInjectableDeclaration<NotificationService>;
407
+ }
408
+
409
+ interface RealtimeTableEvent<T> {
410
+ /** Value the event is matched to a row with (via `matchKey`). */
411
+ key: any;
412
+ /** Fields to merge onto the matched row. */
413
+ patch: Partial<T>;
414
+ /** Marks a final state (e.g. COMPLETED) — forwarded to `onApplied`. */
415
+ terminal?: boolean;
416
+ }
417
+ interface RealtimeTableSyncOptions<T> {
418
+ /** Hub event name to subscribe to (via NotificationService.on$). */
419
+ event: string;
420
+ /** Parse the raw payload; return null to ignore the event. */
421
+ parse: (raw: any) => RealtimeTableEvent<T> | null;
422
+ /** Current table rows (live reference is fine). */
423
+ getRows: () => T[];
424
+ /** Replace table rows (callers usually also trigger change detection here). */
425
+ setRows: (rows: T[]) => void;
426
+ /** Key events match rows on (e.g. row.analyzeCode). */
427
+ matchKey: (row: T) => any;
428
+ /**
429
+ * Stable identity used when merging a background re-fetch into the current
430
+ * rows (existing row objects are patched in place so the table keeps their
431
+ * identity — no flash).
432
+ */
433
+ identityKey: (row: T) => any;
434
+ /** Background list re-fetch used to pick up rows that don't exist yet. */
435
+ fetchList: () => Promise<{
436
+ rows: T[];
437
+ total?: number;
438
+ } | null>;
439
+ /** Called after a patch lands on a row (change detection, terminal enrich…). */
440
+ onApplied?: (row: T, event: RealtimeTableEvent<T>) => void;
441
+ /** Called when a background re-fetch produced a new total. */
442
+ onTotal?: (total: number) => void;
443
+ /** Debounce for the background sync (default 1200ms). */
444
+ debounceMs?: number;
445
+ /** Consecutive no-op syncs before giving up on buffered keys (default 3). */
446
+ idleCap?: number;
447
+ }
448
+ /**
449
+ * Live-progress plumbing for server-paginated tables fed by hub events:
450
+ * events matching a visible row are merged in place; events for rows that
451
+ * are not in the list yet (a just-created record whose list read lags) are
452
+ * buffered by key and replayed after a debounced, idle-capped background
453
+ * re-fetch that merges by stable identity.
454
+ *
455
+ * The domain contract (event name, payload parsing, terminal semantics) is
456
+ * injected via options — nothing app-specific lives here.
457
+ */
458
+ declare class RealtimeTableSync<T = any> {
459
+ private notifications;
460
+ private options;
461
+ private pending;
462
+ private syncTimer;
463
+ private idleSyncs;
464
+ private stopped;
465
+ private subscription;
466
+ constructor(notifications: NotificationService, options: RealtimeTableSyncOptions<T>);
467
+ /**
468
+ * Subscribe to the hub event. Pass a DestroyRef to tie teardown to a
469
+ * component lifecycle; stop() is still available for manual control.
470
+ */
471
+ start(destroyRef?: DestroyRef): this;
472
+ stop(): void;
473
+ /**
474
+ * Replay buffered events onto the current rows (call from setDataSource so
475
+ * a regular refresh also applies buffered progress). Returns true if
476
+ * anything was applied.
477
+ */
478
+ applyPending(): boolean;
479
+ private handleEvent;
480
+ private scheduleSync;
481
+ private syncFromServer;
482
+ }
483
+
228
484
  declare class FxUtils {
229
485
  private static preresolve;
230
- static resolve(value: Object): Promise<{}>;
486
+ static resolve(value: object): Promise<{}>;
231
487
  static isNotNull(obj: any): boolean;
232
488
  static isNull(obj: any): boolean;
233
489
  static isFunction(obj: any): boolean;
@@ -242,12 +498,86 @@ declare class FxUtils {
242
498
  static isSameCollection(collection: any[], compareCollection: any): boolean;
243
499
  static isSameValue(model: any, compareModel: any): boolean;
244
500
  static parseError(err: HttpErrorResponse): any;
245
- static convertColorFromVariable(name: string, alpha?: number): string;
501
+ /**
502
+ * Resolve a theme channel triple (`--danger: 255 122 0`) to a CSS colour.
503
+ * Pass `legacyCommaSyntax: true` for canvas/ECharts consumers: canvas paints
504
+ * both forms, but zrender's colour parser can't read the CSS4 space syntax
505
+ * and renders slices black on hover when given it.
506
+ */
507
+ static convertColorFromVariable(name: string, alpha?: number, options?: {
508
+ legacyCommaSyntax?: boolean;
509
+ }): string;
246
510
  static getTagClass(key: string, isCriticalExist?: boolean): TagType;
247
511
  static validateEmail(value: string): boolean;
512
+ /** Safe deep accessor with the org-wide empty placeholder. */
513
+ static value(model: any, key: string, defaultValue?: any): any;
514
+ /**
515
+ * Severity weight for ordering — kept next to getTagClass so ordering and
516
+ * colouring can never drift apart.
517
+ */
518
+ static severityWeight(level: string): number;
519
+ /** Org-wide date-time rendering (DD/MM/YYYY HH:mm:ss, local time). */
520
+ static formatDateTime(time: string | Date): string;
521
+ /** Seconds → compact duration ("2d 4h", "3h 12m", "45s"). */
522
+ static formatDuration(totalSeconds: number): string;
523
+ /** Relative time within the last 24h ("3 hours ago"), else DD/MM/YYYY. */
524
+ static formatRelative(time: string | Date): string;
525
+ /**
526
+ * Normalize a snake_case + protobuf-Long API payload for camelCase binding:
527
+ * - genuine snake_case keys -> camelCase (data-as-key entries such as DLL
528
+ * names like "kernel32.dll" are left untouched by the strict regex);
529
+ * - Long-encoded numbers `{ high, low, unsigned }` -> plain number.
530
+ */
531
+ static camelizeDeep(input: any): any;
248
532
  static formatSizeUnits(bytes: number): string;
249
533
  }
250
534
 
535
+ /**
536
+ * Shared value→colour rules for report/metric displays.
537
+ *
538
+ * Every metric that varies in meaning (severity, score, count…) gets ONE rule
539
+ * so the colour is consistent everywhere and callers never hardcode a tone
540
+ * for a value that can be good or bad. Domain-specific rules (EPSS, exploit
541
+ * maturity, license categories…) stay in the consuming app — only the
542
+ * mechanism and the org-wide rules live here.
543
+ *
544
+ * There is intentionally NO `default` text/bg colour in the theme, so rule
545
+ * helpers return `null` for "no meaningful value" and the `toneText` /
546
+ * `toneBg` / `toneBadge` wrappers fall back to a neutral class.
547
+ *
548
+ * Every emitted utility must appear below as a WHOLE literal string — the
549
+ * Tailwind content scanner (v4 has no safelist) only sees complete class
550
+ * names. Never rebuild these with string interpolation.
551
+ */
552
+ type Tone = 'critical' | 'danger' | 'warning' | 'success' | 'information';
553
+ /** Severity / risk-level string → tone (Critical & High → danger, Medium → warning, Low → success). */
554
+ declare function severityTone(value: any): Tone | null;
555
+ /**
556
+ * CVSS-style 0–10 score → tone, following the CVSS v3 qualitative bands
557
+ * (≥9 Critical, ≥7 High, ≥4 Medium, else Low). Backends occasionally send a
558
+ * 0–100 scale, so values > 10 are normalised down by /10.
559
+ */
560
+ declare function scoreTone(score: any): Tone | null;
561
+ /**
562
+ * Count of "bad" things → tone: 0 is good (success), anything positive is bad.
563
+ * `positiveTone` sets how severe a non-zero count reads (default `danger`;
564
+ * pass `critical` for the worst metrics, `warning` for milder ones).
565
+ * Non-numeric values (e.g. "--") return null → neutral.
566
+ */
567
+ declare function countTone(count: any, positiveTone?: Tone): Tone | null;
568
+ /** Tone → text colour class, with a neutral fallback when there is no value. */
569
+ declare function toneText(tone: Tone | null): string;
570
+ /** Tone → background colour class, with a neutral fallback when there is no value. */
571
+ declare function toneBg(tone: Tone | null): string;
572
+ /** Tone → soft pill/badge classes (tinted bg + matching text), neutral fallback. */
573
+ declare function toneBadge(tone: Tone | null): string;
574
+ /**
575
+ * Tone → resolved CSS colour string for ECharts / canvas where a Tailwind
576
+ * class can't be used (e.g. per-slice pie `itemStyle.color`). Emits the
577
+ * legacy comma syntax — see FxUtils.convertColorFromVariable.
578
+ */
579
+ declare function toneColor(tone: Tone | null, alpha?: number): string;
580
+
251
581
  declare class FxValidators {
252
582
  /**
253
583
  * Name fields: firstName, lastName, groupName, projectName, displayName
@@ -413,7 +743,7 @@ declare class QuillStyleLoaderService {
413
743
  private platformId;
414
744
  private loaded;
415
745
  private loadingPromise;
416
- constructor(platformId: Object);
746
+ constructor(platformId: object);
417
747
  /**
418
748
  * Load Quill CSS (only in browser). Returns a promise that resolves when
419
749
  * the CSS links have been appended.
@@ -439,76 +769,41 @@ declare class ThemeService {
439
769
  static ɵprov: i0.ɵɵInjectableDeclaration<ThemeService>;
440
770
  }
441
771
 
442
- declare class NotificationService {
443
- private hubConnection;
444
- private connectionStatus;
445
- constructor();
446
- /**
447
- * Connect to SignalR Hub
448
- * @param hubUrl - The URL of the SignalR hub
449
- * @returns Promise that resolves when connected
450
- */
451
- connect(hubUrl: string, options?: {
452
- headers?: any;
453
- accessTokenFactory?: () => string | Promise<string>;
454
- }): Promise<void>;
455
- /**
456
- * Disconnect from SignalR Hub
457
- */
458
- disconnect(): Promise<void>;
772
+ type ErrorMessages = Record<string, any>;
773
+ declare abstract class FxComponent<T> implements ControlValueAccessor {
459
774
  /**
460
- * Listen to a specific event from the server
461
- * @param eventName - Name of the event to listen to
462
- * @param callback - Callback function to execute when event is received
775
+ * Injected via inject() rather than a constructor parameter: parameter
776
+ * decorators (@Optional/@Self) are NOT inherited by subclasses, which used
777
+ * to make every control crash when used without a form binding, or silently
778
+ * bind to an ancestor's NgControl.
463
779
  */
464
- on(eventName: string, callback: (...args: any[]) => void): void;
465
- /**
466
- * Remove listener for a specific event
467
- * @param eventName - Name of the event to stop listening to
468
- */
469
- off(eventName: string): void;
470
- /**
471
- * Invoke a method on the server
472
- * @param methodName - Name of the method to invoke
473
- * @param args - Arguments to pass to the method
474
- */
475
- invoke(methodName: string, ...args: any[]): Promise<any>;
476
- /**
477
- * Get current connection status
478
- */
479
- getConnectionStatus(): 'disconnected' | 'connecting' | 'connected';
480
- /**
481
- * Get connection ID
482
- */
483
- getConnectionId(): string | null;
484
- static ɵfac: i0.ɵɵFactoryDeclaration<NotificationService, never>;
485
- static ɵprov: i0.ɵɵInjectableDeclaration<NotificationService>;
486
- }
487
-
488
- type ErrorMessages = {
489
- [key: string]: any;
490
- };
491
- declare class FxComponent<T> implements ControlValueAccessor {
492
- ngControl: NgControl;
780
+ ngControl: NgControl | null;
781
+ disabled: boolean;
493
782
  value: T;
494
783
  onChange: (value: T) => void;
495
784
  onTouched: () => void;
496
- validationError: ErrorMessages;
785
+ validationError?: ErrorMessages;
497
786
  errorMessages?: ErrorMessages;
498
- constructor(ngControl: NgControl);
787
+ constructor();
499
788
  setValue(value: T): void;
500
789
  onEnter(value: T): void;
501
790
  writeValue(value: T): void;
502
791
  registerOnChange(fn: (value: T) => void): void;
503
792
  registerOnTouched(fn: () => void): void;
793
+ setDisabledState(isDisabled: boolean): void;
504
794
  get invalid(): boolean;
505
- get errors(): {
506
- [key: string]: any;
507
- };
508
- validate(validateFn: Function): void;
795
+ get errors(): Record<string, any>;
796
+ validate(validateFn?: (value: T) => ValidationErrors | null | undefined): void;
509
797
  setErrors(error: ValidationErrors): void;
798
+ /**
799
+ * Removes only the errors this component set imperatively via setErrors().
800
+ * Errors owned by the validator pipeline (built-in or custom validators)
801
+ * are left untouched.
802
+ */
510
803
  clearErrors(): void;
511
804
  getErrorMessage(label?: string): string | null;
805
+ static ɵfac: i0.ɵɵFactoryDeclaration<FxComponent<any>, never>;
806
+ static ɵdir: i0.ɵɵDirectiveDeclaration<FxComponent<any>, never, never, { "disabled": { "alias": "disabled"; "required": false; }; }, {}, never, never, true, never>;
512
807
  }
513
808
 
514
809
  declare class InputComponent extends FxComponent<string> implements AfterViewInit {
@@ -517,11 +812,8 @@ declare class InputComponent extends FxComponent<string> implements AfterViewIni
517
812
  tooltip: string;
518
813
  type: string;
519
814
  placeholder: string;
520
- errorMessages: {
521
- [key: string]: string;
522
- };
815
+ errorMessages: Record<string, string>;
523
816
  required: string | boolean;
524
- disabled: boolean;
525
817
  suffixIcon?: string;
526
818
  class?: any;
527
819
  maxlength?: number;
@@ -529,11 +821,14 @@ declare class InputComponent extends FxComponent<string> implements AfterViewIni
529
821
  blurred: EventEmitter<void>;
530
822
  focused: EventEmitter<void>;
531
823
  suffixClick: EventEmitter<void>;
824
+ /** Accessible name for the suffix icon button (it renders no text). */
825
+ suffixAriaLabel: string;
826
+ readonly fieldId: string;
532
827
  showPassword: boolean;
533
828
  validateError: ValidationErrors | null;
534
- constructor(ngControl: NgControl, ref: ChangeDetectorRef);
829
+ constructor(ref: ChangeDetectorRef);
535
830
  ngAfterViewInit(): void;
536
- setDisabledState?(isDisabled: boolean): void;
831
+ writeValue(value: string): void;
537
832
  onInput(event: Event): void;
538
833
  onFocus(): void;
539
834
  onBlur(): void;
@@ -541,7 +836,7 @@ declare class InputComponent extends FxComponent<string> implements AfterViewIni
541
836
  onSuffixClick(): void;
542
837
  get displayType(): string;
543
838
  static ɵfac: i0.ɵɵFactoryDeclaration<InputComponent, never>;
544
- static ɵcmp: i0.ɵɵComponentDeclaration<InputComponent, "fx-ui-input", never, { "label": { "alias": "label"; "required": false; }; "tooltip": { "alias": "tooltip"; "required": false; }; "type": { "alias": "type"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "errorMessages": { "alias": "errorMessages"; "required": false; }; "required": { "alias": "required"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "suffixIcon": { "alias": "suffixIcon"; "required": false; }; "class": { "alias": "class"; "required": false; }; "maxlength": { "alias": "maxlength"; "required": false; }; "validateFn": { "alias": "validateFn"; "required": false; }; }, { "blurred": "blurred"; "focused": "focused"; "suffixClick": "suffixClick"; }, never, never, false, never>;
839
+ static ɵcmp: i0.ɵɵComponentDeclaration<InputComponent, "fx-ui-input", never, { "label": { "alias": "label"; "required": false; }; "tooltip": { "alias": "tooltip"; "required": false; }; "type": { "alias": "type"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "errorMessages": { "alias": "errorMessages"; "required": false; }; "required": { "alias": "required"; "required": false; }; "suffixIcon": { "alias": "suffixIcon"; "required": false; }; "class": { "alias": "class"; "required": false; }; "maxlength": { "alias": "maxlength"; "required": false; }; "validateFn": { "alias": "validateFn"; "required": false; }; "suffixAriaLabel": { "alias": "suffixAriaLabel"; "required": false; }; }, { "blurred": "blurred"; "focused": "focused"; "suffixClick": "suffixClick"; }, never, never, false, never>;
545
840
  }
546
841
 
547
842
  declare class SelectComponent extends FxComponent<string | string[]> implements AfterViewInit, OnInit, OnChanges {
@@ -554,10 +849,7 @@ declare class SelectComponent extends FxComponent<string | string[]> implements
554
849
  value: string;
555
850
  }[];
556
851
  multiple: boolean;
557
- disabled: boolean;
558
- errorMessages: {
559
- [key: string]: string;
560
- };
852
+ errorMessages: Record<string, string>;
561
853
  required: boolean;
562
854
  class?: any;
563
855
  enableSearch: boolean;
@@ -567,13 +859,16 @@ declare class SelectComponent extends FxComponent<string | string[]> implements
567
859
  }[]>;
568
860
  /** Emits the current value when the select panel closes (useful for multiple mode). */
569
861
  closed: EventEmitter<string | string[]>;
862
+ readonly fieldId: string;
570
863
  searchTerm: string;
571
864
  filteredOptions: {
572
865
  label: string;
573
866
  value: string;
574
867
  }[];
575
868
  private search$;
576
- constructor(ngControl: NgControl, ref: ChangeDetectorRef);
869
+ private destroyRef;
870
+ constructor(ref: ChangeDetectorRef);
871
+ writeValue(value: string | string[]): void;
577
872
  ngOnInit(): void;
578
873
  ngOnChanges(changes: SimpleChanges): void;
579
874
  ngAfterViewInit(): void;
@@ -583,7 +878,7 @@ declare class SelectComponent extends FxComponent<string | string[]> implements
583
878
  onSelectionChange(value: any): void;
584
879
  isSelected(value: string): boolean;
585
880
  static ɵfac: i0.ɵɵFactoryDeclaration<SelectComponent, never>;
586
- static ɵcmp: i0.ɵɵComponentDeclaration<SelectComponent, "fx-ui-select", never, { "label": { "alias": "label"; "required": false; }; "tooltip": { "alias": "tooltip"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "options": { "alias": "options"; "required": false; }; "multiple": { "alias": "multiple"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "errorMessages": { "alias": "errorMessages"; "required": false; }; "required": { "alias": "required"; "required": false; }; "class": { "alias": "class"; "required": false; }; "enableSearch": { "alias": "enableSearch"; "required": false; }; "searchFn": { "alias": "searchFn"; "required": false; }; }, { "closed": "closed"; }, never, never, false, never>;
881
+ static ɵcmp: i0.ɵɵComponentDeclaration<SelectComponent, "fx-ui-select", never, { "label": { "alias": "label"; "required": false; }; "tooltip": { "alias": "tooltip"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "options": { "alias": "options"; "required": false; }; "multiple": { "alias": "multiple"; "required": false; }; "errorMessages": { "alias": "errorMessages"; "required": false; }; "required": { "alias": "required"; "required": false; }; "class": { "alias": "class"; "required": false; }; "enableSearch": { "alias": "enableSearch"; "required": false; }; "searchFn": { "alias": "searchFn"; "required": false; }; }, { "closed": "closed"; }, never, never, false, never>;
587
882
  }
588
883
 
589
884
  interface IRadioButton {
@@ -594,6 +889,7 @@ interface IRadioButton {
594
889
  }
595
890
  declare class RadioButtonComponent extends FxComponent<IRadioButton> implements AfterViewInit {
596
891
  private ref;
892
+ readonly groupId: string;
597
893
  label?: string;
598
894
  tooltip: string;
599
895
  required?: boolean;
@@ -603,40 +899,37 @@ declare class RadioButtonComponent extends FxComponent<IRadioButton> implements
603
899
  icon?: any;
604
900
  tooltip?: string;
605
901
  }[];
606
- disabled: boolean;
607
902
  errorMessages: ErrorMessages;
608
903
  class?: any;
609
- constructor(ngControl: NgControl, ref: ChangeDetectorRef);
904
+ constructor(ref: ChangeDetectorRef);
610
905
  ngAfterViewInit(): void;
611
- setDisabledState?(isDisabled: boolean): void;
612
906
  onSelectValue(value: any): void;
613
907
  static ɵfac: i0.ɵɵFactoryDeclaration<RadioButtonComponent, never>;
614
- static ɵcmp: i0.ɵɵComponentDeclaration<RadioButtonComponent, "fx-ui-radio", never, { "label": { "alias": "label"; "required": false; }; "tooltip": { "alias": "tooltip"; "required": false; }; "required": { "alias": "required"; "required": false; }; "options": { "alias": "options"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "errorMessages": { "alias": "errorMessages"; "required": false; }; "class": { "alias": "class"; "required": false; }; }, {}, never, never, false, never>;
908
+ static ɵcmp: i0.ɵɵComponentDeclaration<RadioButtonComponent, "fx-ui-radio", never, { "label": { "alias": "label"; "required": false; }; "tooltip": { "alias": "tooltip"; "required": false; }; "required": { "alias": "required"; "required": false; }; "options": { "alias": "options"; "required": false; }; "errorMessages": { "alias": "errorMessages"; "required": false; }; "class": { "alias": "class"; "required": false; }; }, {}, never, never, false, never>;
615
909
  }
616
910
 
617
911
  declare class CheckboxComponent extends FxComponent<any> implements AfterViewInit {
618
912
  private ref;
619
913
  label: string;
620
- disabled: boolean;
621
914
  rounded: boolean;
622
915
  valueChange: EventEmitter<boolean>;
623
- constructor(ngControl: NgControl, ref: ChangeDetectorRef);
916
+ constructor(ref: ChangeDetectorRef);
624
917
  ngAfterViewInit(): void;
625
- setDisabledState?(isDisabled: boolean): void;
918
+ writeValue(value: any): void;
626
919
  onInputChange(event: Event): void;
627
920
  markTouched(): void;
628
921
  static ɵfac: i0.ɵɵFactoryDeclaration<CheckboxComponent, never>;
629
- static ɵcmp: i0.ɵɵComponentDeclaration<CheckboxComponent, "fx-ui-checkbox", never, { "label": { "alias": "label"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "rounded": { "alias": "rounded"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, false, never>;
922
+ static ɵcmp: i0.ɵɵComponentDeclaration<CheckboxComponent, "fx-ui-checkbox", never, { "label": { "alias": "label"; "required": false; }; "rounded": { "alias": "rounded"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, false, never>;
630
923
  }
631
924
 
632
- type UploadResult = {
925
+ interface UploadResult {
633
926
  files: File[];
634
927
  accepted: File[];
635
928
  rejected: {
636
929
  file: File;
637
930
  reason: string;
638
931
  }[];
639
- };
932
+ }
640
933
  declare class DndUploadComponent {
641
934
  multiple: boolean;
642
935
  accept: string;
@@ -675,14 +968,19 @@ declare class ButtonComponent {
675
968
  icon?: any;
676
969
  class?: any;
677
970
  loading: boolean;
971
+ /** Native button type. Defaults to 'button' so it never implicitly submits a form. */
972
+ type: 'button' | 'submit' | 'reset';
973
+ /** Accessible name for icon-only usage (icon set, no label). */
974
+ ariaLabel: string;
678
975
  clicked: EventEmitter<void>;
679
976
  onClick(): void;
680
977
  static ɵfac: i0.ɵɵFactoryDeclaration<ButtonComponent, never>;
681
- static ɵcmp: i0.ɵɵComponentDeclaration<ButtonComponent, "fx-ui-button", never, { "label": { "alias": "label"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "buttonVariant": { "alias": "buttonVariant"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "class": { "alias": "class"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; }, { "clicked": "clicked"; }, never, never, false, never>;
978
+ static ɵcmp: i0.ɵɵComponentDeclaration<ButtonComponent, "fx-ui-button", never, { "label": { "alias": "label"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "buttonVariant": { "alias": "buttonVariant"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "class": { "alias": "class"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "type": { "alias": "type"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; }, { "clicked": "clicked"; }, never, never, false, never>;
682
979
  }
683
980
 
684
981
  declare class RadioButtonToggleComponent extends FxComponent<any> implements AfterViewInit {
685
982
  private ref;
983
+ readonly groupId: string;
686
984
  label?: string;
687
985
  required?: boolean;
688
986
  options: {
@@ -690,38 +988,34 @@ declare class RadioButtonToggleComponent extends FxComponent<any> implements Aft
690
988
  value: any;
691
989
  icon?: any;
692
990
  }[];
693
- disabled: boolean;
694
991
  errorMessages: ErrorMessages;
695
992
  class?: any;
696
- constructor(ngControl: NgControl, ref: ChangeDetectorRef);
993
+ constructor(ref: ChangeDetectorRef);
697
994
  ngAfterViewInit(): void;
698
- setDisabledState?(isDisabled: boolean): void;
699
995
  onSelectValue(value: any): void;
700
996
  static ɵfac: i0.ɵɵFactoryDeclaration<RadioButtonToggleComponent, never>;
701
- static ɵcmp: i0.ɵɵComponentDeclaration<RadioButtonToggleComponent, "fx-ui-radio-toggle, [fx-ui-radio-toggle]", never, { "label": { "alias": "label"; "required": false; }; "required": { "alias": "required"; "required": false; }; "options": { "alias": "options"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "errorMessages": { "alias": "errorMessages"; "required": false; }; "class": { "alias": "class"; "required": false; }; }, {}, never, never, false, never>;
997
+ static ɵcmp: i0.ɵɵComponentDeclaration<RadioButtonToggleComponent, "fx-ui-radio-toggle, [fx-ui-radio-toggle]", never, { "label": { "alias": "label"; "required": false; }; "required": { "alias": "required"; "required": false; }; "options": { "alias": "options"; "required": false; }; "errorMessages": { "alias": "errorMessages"; "required": false; }; "class": { "alias": "class"; "required": false; }; }, {}, never, never, false, never>;
702
998
  }
703
999
 
704
- declare class DatetimePicker extends FxComponent<any> implements AfterViewInit, OnInit {
1000
+ declare class DatetimePicker extends FxComponent<any> implements AfterViewInit {
705
1001
  private ref;
706
1002
  label?: string;
707
1003
  placeholder: string;
708
1004
  required: boolean;
709
1005
  type: any;
710
- disabled: boolean;
711
1006
  minDate?: any;
712
1007
  maxDate?: any;
713
1008
  errorMessages: ErrorMessages;
714
1009
  validateFn: (date: string) => ValidationErrors | null;
1010
+ readonly fieldId: string;
715
1011
  startAt: any;
716
- constructor(ngControl: NgControl, ref: ChangeDetectorRef);
717
- ngOnInit(): void;
1012
+ constructor(ref: ChangeDetectorRef);
718
1013
  ngAfterViewInit(): void;
719
- setDisabledState?(isDisabled: boolean): void;
720
1014
  onBlur(): void;
721
1015
  writeValue(value: any): void;
722
1016
  onValueChange(date: any): void;
723
1017
  static ɵfac: i0.ɵɵFactoryDeclaration<DatetimePicker, never>;
724
- static ɵcmp: i0.ɵɵComponentDeclaration<DatetimePicker, "fx-ui-datetime-picker", never, { "label": { "alias": "label"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "required": { "alias": "required"; "required": false; }; "type": { "alias": "type"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "minDate": { "alias": "minDate"; "required": false; }; "maxDate": { "alias": "maxDate"; "required": false; }; "errorMessages": { "alias": "errorMessages"; "required": false; }; "validateFn": { "alias": "validateFn"; "required": false; }; }, {}, never, never, false, never>;
1018
+ static ɵcmp: i0.ɵɵComponentDeclaration<DatetimePicker, "fx-ui-datetime-picker", never, { "label": { "alias": "label"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "required": { "alias": "required"; "required": false; }; "type": { "alias": "type"; "required": false; }; "minDate": { "alias": "minDate"; "required": false; }; "maxDate": { "alias": "maxDate"; "required": false; }; "errorMessages": { "alias": "errorMessages"; "required": false; }; "validateFn": { "alias": "validateFn"; "required": false; }; }, {}, never, never, false, never>;
725
1019
  }
726
1020
 
727
1021
  declare class LoadingPanel {
@@ -734,16 +1028,16 @@ declare class LoadingPanel {
734
1028
  declare class SearchBarComponent extends FxComponent<string> implements AfterViewInit {
735
1029
  private ref;
736
1030
  placeholder: string;
737
- disabled: boolean;
738
1031
  search: EventEmitter<string>;
739
1032
  valueChange: EventEmitter<string>;
740
- constructor(ngControl: NgControl, ref: ChangeDetectorRef);
1033
+ constructor(ref: ChangeDetectorRef);
741
1034
  ngAfterViewInit(): void;
1035
+ writeValue(value: string): void;
742
1036
  onValueChange(value: string): void;
743
1037
  onEnterKey(): void;
744
1038
  clear(): void;
745
1039
  static ɵfac: i0.ɵɵFactoryDeclaration<SearchBarComponent, never>;
746
- static ɵcmp: i0.ɵɵComponentDeclaration<SearchBarComponent, "fx-ui-search-bar", never, { "placeholder": { "alias": "placeholder"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "search": "search"; "valueChange": "valueChange"; }, never, never, false, never>;
1040
+ static ɵcmp: i0.ɵɵComponentDeclaration<SearchBarComponent, "fx-ui-search-bar", never, { "placeholder": { "alias": "placeholder"; "required": false; }; }, { "search": "search"; "valueChange": "valueChange"; }, never, never, false, never>;
747
1041
  }
748
1042
 
749
1043
  declare class TabComponent {
@@ -768,6 +1062,8 @@ declare class TabGroupComponent implements AfterContentInit {
768
1062
  constructor(renderer: Renderer2);
769
1063
  ngAfterContentInit(): void;
770
1064
  selectTab(index: number): void;
1065
+ /** Roving tablist keyboard nav: arrows move AND activate (selection follows focus). */
1066
+ onTabKeydown(event: KeyboardEvent, index: number): void;
771
1067
  private updateUnderlinePosition;
772
1068
  private scrollToActiveTab;
773
1069
  scroll(direction: 'left' | 'right'): void;
@@ -816,13 +1112,13 @@ declare class TagComponent {
816
1112
  rounded: boolean;
817
1113
  icon?: any;
818
1114
  solid: boolean;
819
- click: EventEmitter<void>;
1115
+ clicked: EventEmitter<void>;
820
1116
  onClick(): void;
821
1117
  static ɵfac: i0.ɵɵFactoryDeclaration<TagComponent, never>;
822
- static ɵcmp: i0.ɵɵComponentDeclaration<TagComponent, "fx-ui-tag", never, { "label": { "alias": "label"; "required": false; }; "type": { "alias": "type"; "required": false; }; "rounded": { "alias": "rounded"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "solid": { "alias": "solid"; "required": false; }; }, { "click": "click"; }, never, never, false, never>;
1118
+ static ɵcmp: i0.ɵɵComponentDeclaration<TagComponent, "fx-ui-tag", never, { "label": { "alias": "label"; "required": false; }; "type": { "alias": "type"; "required": false; }; "rounded": { "alias": "rounded"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "solid": { "alias": "solid"; "required": false; }; }, { "clicked": "clicked"; }, never, never, false, never>;
823
1119
  }
824
1120
 
825
- type IChartType = 'bar' | 'pie' | 'line' | 'sunburst' | 'radar' | 'auto';
1121
+ type IChartType = 'bar' | 'pie' | 'sunburst' | 'auto';
826
1122
  declare class ChartComponent implements OnChanges, AfterViewInit, OnDestroy {
827
1123
  private ref;
828
1124
  private cdr;
@@ -877,12 +1173,11 @@ declare class SliderComponent extends FxComponent<any> implements AfterViewInit
877
1173
  max: number;
878
1174
  step: number;
879
1175
  vertical: boolean;
880
- disabled: boolean;
881
1176
  valueChange: EventEmitter<number>;
882
1177
  dragging: boolean;
883
- constructor(ngControl: NgControl, ref: ChangeDetectorRef);
1178
+ constructor(ref: ChangeDetectorRef);
884
1179
  ngAfterViewInit(): void;
885
- setDisabledState?(isDisabled: boolean): void;
1180
+ setDisabledState(isDisabled: boolean): void;
886
1181
  writeValue(value: number): void;
887
1182
  private _normalizeValue;
888
1183
  private _decimalPlaces;
@@ -906,19 +1201,20 @@ declare class SliderComponent extends FxComponent<any> implements AfterViewInit
906
1201
  bottom?: undefined;
907
1202
  };
908
1203
  static ɵfac: i0.ɵɵFactoryDeclaration<SliderComponent, never>;
909
- static ɵcmp: i0.ɵɵComponentDeclaration<SliderComponent, "fx-ui-slider", never, { "min": { "alias": "min"; "required": false; }; "max": { "alias": "max"; "required": false; }; "step": { "alias": "step"; "required": false; }; "vertical": { "alias": "vertical"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, false, never>;
1204
+ static ɵcmp: i0.ɵɵComponentDeclaration<SliderComponent, "fx-ui-slider", never, { "min": { "alias": "min"; "required": false; }; "max": { "alias": "max"; "required": false; }; "step": { "alias": "step"; "required": false; }; "vertical": { "alias": "vertical"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, false, never>;
910
1205
  }
911
1206
 
912
1207
  declare class SwitchComponent extends FxComponent<any> implements AfterViewInit {
913
1208
  private cdr;
914
- disabled: boolean;
915
1209
  onSwitch: EventEmitter<boolean>;
1210
+ /** Accessible name — the switch renders no visible text of its own. */
1211
+ ariaLabel: string;
916
1212
  ngAfterViewInit(): void;
917
- constructor(ngControl: NgControl, cdr: ChangeDetectorRef);
918
- setDisabledState(isDisabled: boolean): void;
1213
+ constructor(cdr: ChangeDetectorRef);
1214
+ writeValue(value: any): void;
919
1215
  toggle(): void;
920
1216
  static ɵfac: i0.ɵɵFactoryDeclaration<SwitchComponent, never>;
921
- static ɵcmp: i0.ɵɵComponentDeclaration<SwitchComponent, "fx-ui-switch", never, { "disabled": { "alias": "disabled"; "required": false; }; }, { "onSwitch": "onSwitch"; }, never, never, false, never>;
1217
+ static ɵcmp: i0.ɵɵComponentDeclaration<SwitchComponent, "fx-ui-switch", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; }; }, { "onSwitch": "onSwitch"; }, never, never, false, never>;
922
1218
  }
923
1219
 
924
1220
  declare class RichTextAreaComponent extends FxComponent<any> implements AfterViewInit {
@@ -930,7 +1226,7 @@ declare class RichTextAreaComponent extends FxComponent<any> implements AfterVie
930
1226
  toolbarOptions: any;
931
1227
  contentChange: EventEmitter<string>;
932
1228
  private quillInstance;
933
- constructor(ngControl: NgControl, cdr: ChangeDetectorRef, styleLoader: QuillStyleLoaderService, platformId: Object);
1229
+ constructor(cdr: ChangeDetectorRef, styleLoader: QuillStyleLoaderService, platformId: object);
934
1230
  ngAfterViewInit(): Promise<void>;
935
1231
  writeValue(value: any): void;
936
1232
  setDisabledState(isDisabled: boolean): void;
@@ -1067,6 +1363,195 @@ declare class DrawerComponent implements OnInit, OnDestroy {
1067
1363
  static ɵcmp: i0.ɵɵComponentDeclaration<DrawerComponent, "fx-ui-drawer", never, { "items": { "alias": "items"; "required": false; }; "isExpanded": { "alias": "isExpanded"; "required": false; }; "logo": { "alias": "logo"; "required": false; }; "version": { "alias": "version"; "required": false; }; }, { "toggleExpanded": "toggleExpanded"; "itemClicked": "itemClicked"; }, never, never, false, never>;
1068
1364
  }
1069
1365
 
1366
+ /** Row-card skeleton placeholder for master-detail list panes. */
1367
+ declare class SkeletonListComponent {
1368
+ rows: number;
1369
+ range(n: number): number[];
1370
+ static ɵfac: i0.ɵɵFactoryDeclaration<SkeletonListComponent, never>;
1371
+ static ɵcmp: i0.ɵɵComponentDeclaration<SkeletonListComponent, "fx-ui-skeleton-list", never, { "rows": { "alias": "rows"; "required": false; }; }, {}, never, never, false, never>;
1372
+ }
1373
+
1374
+ /** Card-shaped skeleton placeholder for detail panels. */
1375
+ declare class SkeletonDetailComponent {
1376
+ /** Number of content cards rendered below the header card. */
1377
+ cards: number;
1378
+ /** Rows per content card. */
1379
+ rows: number;
1380
+ range(n: number): number[];
1381
+ rowWidth(i: number): number;
1382
+ static ɵfac: i0.ɵɵFactoryDeclaration<SkeletonDetailComponent, never>;
1383
+ static ɵcmp: i0.ɵɵComponentDeclaration<SkeletonDetailComponent, "fx-ui-skeleton-detail", never, { "cards": { "alias": "cards"; "required": false; }; "rows": { "alias": "rows"; "required": false; }; }, {}, never, never, false, never>;
1384
+ }
1385
+
1386
+ interface FxStatCard {
1387
+ /** Caller-translated caption. */
1388
+ label: string;
1389
+ value: string | number;
1390
+ /** hero-icon name shown in the tinted box. */
1391
+ icon?: any;
1392
+ /** Colours the number and the icon box; null/undefined renders neutral. */
1393
+ tone?: Tone | null;
1394
+ }
1395
+ /** KPI tile row: big number + tinted icon box + caption, in a responsive grid. */
1396
+ declare class StatCardsComponent {
1397
+ cards: FxStatCard[];
1398
+ /** Grid columns; defaults to one column per card. */
1399
+ cols?: number;
1400
+ get gridColumns(): string;
1401
+ numClass(card: FxStatCard): string;
1402
+ boxClass(card: FxStatCard): string;
1403
+ static ɵfac: i0.ɵɵFactoryDeclaration<StatCardsComponent, never>;
1404
+ static ɵcmp: i0.ɵɵComponentDeclaration<StatCardsComponent, "fx-ui-stat-cards", never, { "cards": { "alias": "cards"; "required": false; }; "cols": { "alias": "cols"; "required": false; }; }, {}, never, never, false, never>;
1405
+ }
1406
+
1407
+ /** Centered "no data" block. The message is caller-translated (no i18n in lib). */
1408
+ declare class EmptyStateComponent {
1409
+ message: string;
1410
+ /** Optional icon (hero-icon name). */
1411
+ icon?: any;
1412
+ /** Min height of the block, CSS length. */
1413
+ height: string;
1414
+ static ɵfac: i0.ɵɵFactoryDeclaration<EmptyStateComponent, never>;
1415
+ static ɵcmp: i0.ɵɵComponentDeclaration<EmptyStateComponent, "fx-ui-empty-state", never, { "message": { "alias": "message"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "height": { "alias": "height"; "required": false; }; }, {}, never, never, false, never>;
1416
+ }
1417
+
1418
+ interface FxFilterChipOption {
1419
+ /** Caller-translated label. */
1420
+ label: string;
1421
+ /** '' (empty) renders as the neutral "All" chip. */
1422
+ value: string;
1423
+ }
1424
+ /**
1425
+ * Tone-tinted filter chip row. Replaces the per-tab chipClass() copies —
1426
+ * including their classic bug of comparing a hardcoded filter key: the active
1427
+ * chip here is always derived from [value].
1428
+ */
1429
+ declare class FilterChipsComponent {
1430
+ options: FxFilterChipOption[];
1431
+ value: string;
1432
+ valueChange: EventEmitter<string>;
1433
+ /** Per-value tone overrides (e.g. { Safe: 'information', Protected: 'discovery' as any }). */
1434
+ toneOverrides: Record<string, Tone | null>;
1435
+ select(option: FxFilterChipOption): void;
1436
+ chipClass(option: FxFilterChipOption): string;
1437
+ static ɵfac: i0.ɵɵFactoryDeclaration<FilterChipsComponent, never>;
1438
+ static ɵcmp: i0.ɵɵComponentDeclaration<FilterChipsComponent, "fx-ui-filter-chips", never, { "options": { "alias": "options"; "required": false; }; "value": { "alias": "value"; "required": false; }; "toneOverrides": { "alias": "toneOverrides"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, false, never>;
1439
+ }
1440
+
1441
+ /** Thin tone-coloured progress/score bar with optional label and caption. */
1442
+ declare class MeterComponent {
1443
+ value: number;
1444
+ max: number;
1445
+ tone: Tone | null;
1446
+ /** Caller-translated texts; omitted → bar only. */
1447
+ label?: string;
1448
+ caption?: string;
1449
+ get percent(): number;
1450
+ get fillClass(): string;
1451
+ static ɵfac: i0.ɵɵFactoryDeclaration<MeterComponent, never>;
1452
+ static ɵcmp: i0.ɵɵComponentDeclaration<MeterComponent, "fx-ui-meter", never, { "value": { "alias": "value"; "required": false; }; "max": { "alias": "max"; "required": false; }; "tone": { "alias": "tone"; "required": false; }; "label": { "alias": "label"; "required": false; }; "caption": { "alias": "caption"; "required": false; }; }, {}, never, never, false, never>;
1453
+ }
1454
+
1455
+ /** Detail-panel section: card with an icon + heading header and projected body. */
1456
+ declare class SectionCardComponent {
1457
+ /** Caller-translated heading. */
1458
+ title: string;
1459
+ /** hero-icon name; omitted → text-only header. */
1460
+ icon?: any;
1461
+ iconTone: Tone | null;
1462
+ get iconClass(): string;
1463
+ static ɵfac: i0.ɵɵFactoryDeclaration<SectionCardComponent, never>;
1464
+ static ɵcmp: i0.ɵɵComponentDeclaration<SectionCardComponent, "fx-ui-section-card", never, { "title": { "alias": "title"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "iconTone": { "alias": "iconTone"; "required": false; }; }, {}, never, ["*"], false, never>;
1465
+ }
1466
+
1467
+ /**
1468
+ * Label-over-value field for detail panels. The label uses txt-field-label
1469
+ * with its baked-in margin neutralised (the known mb-1 alignment gotcha) —
1470
+ * spacing is owned by this component.
1471
+ */
1472
+ declare class InfoFieldComponent {
1473
+ /** Caller-translated label. */
1474
+ label: string;
1475
+ value: string | number | null | undefined;
1476
+ /** Colours the value; null/undefined renders the primary text colour. */
1477
+ tone: Tone | null;
1478
+ /** Monospace value (hashes, paths). */
1479
+ mono: boolean;
1480
+ /** Placeholder when value is empty. */
1481
+ placeholder: string;
1482
+ get displayValue(): string;
1483
+ get valueClass(): string;
1484
+ static ɵfac: i0.ɵɵFactoryDeclaration<InfoFieldComponent, never>;
1485
+ static ɵcmp: i0.ɵɵComponentDeclaration<InfoFieldComponent, "fx-ui-info-field", never, { "label": { "alias": "label"; "required": false; }; "value": { "alias": "value"; "required": false; }; "tone": { "alias": "tone"; "required": false; }; "mono": { "alias": "mono"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; }, {}, never, never, false, never>;
1486
+ }
1487
+
1488
+ interface FxSeverityBadge {
1489
+ key: string;
1490
+ label: string | number;
1491
+ tone: Tone | null;
1492
+ }
1493
+ /**
1494
+ * Compact total/critical/high/medium(/low) badge cluster used in table cells.
1495
+ * Pass counts via [stats]; missing fields are skipped. Labels are numbers, so
1496
+ * no i18n is involved; the total badge renders neutral.
1497
+ */
1498
+ declare class SeverityBadgesComponent {
1499
+ stats: {
1500
+ total?: number;
1501
+ critical?: number;
1502
+ high?: number;
1503
+ medium?: number;
1504
+ low?: number;
1505
+ } | null;
1506
+ /** Show zero-count badges (default true, mirrors the table-cell usage). */
1507
+ showZero: boolean;
1508
+ /** Append the severity letter to counts ("3C", "5H", "2M") per the report design. */
1509
+ suffixed: boolean;
1510
+ badgeClick: EventEmitter<string>;
1511
+ private static readonly TONES;
1512
+ get badges(): FxSeverityBadge[];
1513
+ badgeClass(badge: FxSeverityBadge): string;
1514
+ static ɵfac: i0.ɵɵFactoryDeclaration<SeverityBadgesComponent, never>;
1515
+ static ɵcmp: i0.ɵɵComponentDeclaration<SeverityBadgesComponent, "fx-ui-severity-badges", never, { "stats": { "alias": "stats"; "required": false; }; "showZero": { "alias": "showZero"; "required": false; }; "suffixed": { "alias": "suffixed"; "required": false; }; }, { "badgeClick": "badgeClick"; }, never, never, false, never>;
1516
+ }
1517
+
1518
+ /**
1519
+ * Two-column master-detail shell driven by a BaseMasterDetailComponent.
1520
+ * The host page projects its own header/filters and supplies templates for
1521
+ * the parts that vary per entity:
1522
+ *
1523
+ * <fx-ui-master-detail [table]="this" [emptyMessage]="'noData' | translate">
1524
+ * <div mdHeader>…title / stat cards…</div>
1525
+ * <div mdFilters>…search bar / filter chips…</div>
1526
+ * <ng-template #row let-item let-selected="selected">…row body…</ng-template>
1527
+ * <ng-template #detail let-detail>…detail pane…</ng-template>
1528
+ * </fx-ui-master-detail>
1529
+ *
1530
+ * The list behaves as a single-select listbox: the selected option is the
1531
+ * tab stop, ArrowUp/Down/Home/End move the selection.
1532
+ */
1533
+ declare class MasterDetailComponent implements AfterViewInit {
1534
+ table: BaseMasterDetailComponent<any>;
1535
+ /** Fixed list-pane width on lg+ viewports (stacked full-width below). */
1536
+ listWidth: string;
1537
+ maxListHeight: string;
1538
+ pageSizeOptions: number[];
1539
+ /** Labels come in via inputs — the lib carries no i18n. */
1540
+ emptyMessage: string;
1541
+ listLabel: string;
1542
+ skeletonCards: number;
1543
+ rowTemplate: TemplateRef<any>;
1544
+ detailTemplate: TemplateRef<any>;
1545
+ paginator: MatPaginator;
1546
+ readonly uid: string;
1547
+ ngAfterViewInit(): void;
1548
+ isSelected(row: any): boolean;
1549
+ optionId(index: number): string;
1550
+ onKeydown(event: KeyboardEvent, index: number): void;
1551
+ static ɵfac: i0.ɵɵFactoryDeclaration<MasterDetailComponent, never>;
1552
+ static ɵcmp: i0.ɵɵComponentDeclaration<MasterDetailComponent, "fx-ui-master-detail", never, { "table": { "alias": "table"; "required": false; }; "listWidth": { "alias": "listWidth"; "required": false; }; "maxListHeight": { "alias": "maxListHeight"; "required": false; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; }; "listLabel": { "alias": "listLabel"; "required": false; }; "skeletonCards": { "alias": "skeletonCards"; "required": false; }; }, {}, ["rowTemplate", "detailTemplate"], ["[mdHeader]", "[mdFilters]"], false, never>;
1553
+ }
1554
+
1070
1555
  declare class ConfirmationDialogComponent {
1071
1556
  private ref;
1072
1557
  bindings: any;
@@ -1093,9 +1578,9 @@ declare const MY_MOMENT_FORMATS: {
1093
1578
  };
1094
1579
  declare class UiModule {
1095
1580
  static ɵfac: i0.ɵɵFactoryDeclaration<UiModule, never>;
1096
- static ɵmod: i0.ɵɵNgModuleDeclaration<UiModule, [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 ChartComponent, typeof SliderComponent, typeof SwitchComponent, typeof RichTextAreaComponent, typeof SkeletonTableLoadingComponent, typeof FlowConnection, typeof CircleProgressBar, typeof TreeDiagram, typeof TableCell, typeof KanbanBoardComponent, typeof DrawerComponent, typeof ConfirmationDialogComponent], [typeof i29.CommonModule, typeof i30.FormsModule, typeof i30.ReactiveFormsModule, typeof i31.RouterModule, typeof i32.OwlDateTimeModule, typeof i32.OwlNativeDateTimeModule, typeof i33.OwlMomentDateTimeModule, typeof HasPermissionDirective, typeof TrimOnBlurDirective, typeof i36.NgHeroiconsModule, typeof i37.VflowComponent, typeof i37.HandleComponent, typeof i37.ResizableComponent, typeof i37.SelectableDirective, typeof i37.MiniMapComponent, typeof i37.NodeToolbarComponent, typeof i37.CustomTemplateEdgeComponent, typeof i37.DragHandleDirective, typeof i37.ConnectionControllerDirective, typeof i37.NodeHtmlTemplateDirective, typeof i37.NodeSvgTemplateDirective, typeof i37.GroupNodeTemplateDirective, typeof i37.EdgeLabelHtmlTemplateDirective, typeof i37.EdgeTemplateDirective, typeof i37.ConnectionTemplateDirective, typeof i37.HandleTemplateDirective, typeof i38.NgxEchartsModule, typeof i39.MatSelectModule, typeof i40.MatRadioModule, typeof i41.MatButtonModule, typeof i42.MatIconModule, typeof i43.MatPaginatorModule, typeof i44.MatTableModule, typeof i45.MatSnackBarModule, typeof i46.MatDialogModule, typeof i47.MatCheckboxModule, typeof i48.MatCardModule, typeof i49.MatDatepickerModule, typeof i50.MatTimepickerModule, typeof i51.MatBadgeModule, typeof i52.MatExpansionModule, typeof i53.MatFormFieldModule, typeof i54.MatMenuModule, typeof i55.MatTooltipModule, typeof i56.DragDropModule], [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 ChartComponent, typeof SliderComponent, typeof SwitchComponent, typeof RichTextAreaComponent, typeof SkeletonTableLoadingComponent, typeof FlowConnection, typeof CircleProgressBar, typeof TreeDiagram, typeof TableCell, typeof KanbanBoardComponent, typeof DrawerComponent, typeof ConfirmationDialogComponent, typeof i30.FormsModule, typeof i30.ReactiveFormsModule, typeof i31.RouterModule, typeof i32.OwlDateTimeModule, typeof i32.OwlNativeDateTimeModule, typeof HasPermissionDirective, typeof i36.NgHeroiconsModule, typeof i39.MatSelectModule, typeof i40.MatRadioModule, typeof i41.MatButtonModule, typeof i42.MatIconModule, typeof i43.MatPaginatorModule, typeof i44.MatTableModule, typeof i45.MatSnackBarModule, typeof i46.MatDialogModule, typeof i47.MatCheckboxModule, typeof i48.MatCardModule, typeof i49.MatDatepickerModule, typeof i50.MatTimepickerModule, typeof i51.MatBadgeModule, typeof i52.MatExpansionModule, typeof i53.MatFormFieldModule, typeof i54.MatMenuModule, typeof i55.MatTooltipModule, typeof i56.DragDropModule]>;
1581
+ static ɵmod: i0.ɵɵNgModuleDeclaration<UiModule, [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 ChartComponent, typeof SliderComponent, typeof SwitchComponent, typeof RichTextAreaComponent, typeof SkeletonTableLoadingComponent, typeof FlowConnection, typeof CircleProgressBar, typeof TreeDiagram, typeof TableCell, typeof KanbanBoardComponent, typeof DrawerComponent, typeof SkeletonListComponent, typeof SkeletonDetailComponent, typeof StatCardsComponent, typeof EmptyStateComponent, typeof FilterChipsComponent, typeof MeterComponent, typeof SectionCardComponent, typeof InfoFieldComponent, typeof SeverityBadgesComponent, typeof MasterDetailComponent, typeof ConfirmationDialogComponent], [typeof i39.CommonModule, typeof i40.FormsModule, typeof i40.ReactiveFormsModule, typeof i41.RouterModule, typeof i42.OwlDateTimeModule, typeof i42.OwlNativeDateTimeModule, typeof i43.OwlMomentDateTimeModule, typeof HasPermissionDirective, typeof TrimOnBlurDirective, typeof i46.NgHeroiconsModule, typeof i47.VflowComponent, typeof i47.HandleComponent, typeof i47.ResizableComponent, typeof i47.SelectableDirective, typeof i47.MiniMapComponent, typeof i47.NodeToolbarComponent, typeof i47.CustomTemplateEdgeComponent, typeof i47.DragHandleDirective, typeof i47.ConnectionControllerDirective, typeof i47.NodeHtmlTemplateDirective, typeof i47.NodeSvgTemplateDirective, typeof i47.GroupNodeTemplateDirective, typeof i47.EdgeLabelHtmlTemplateDirective, typeof i47.EdgeTemplateDirective, typeof i47.ConnectionTemplateDirective, typeof i47.HandleTemplateDirective, typeof i48.NgxEchartsModule, typeof i49.MatSelectModule, typeof i50.MatRadioModule, typeof i51.MatButtonModule, typeof i52.MatIconModule, typeof i53.MatPaginatorModule, typeof i54.MatTableModule, typeof i55.MatSnackBarModule, typeof i56.MatDialogModule, typeof i57.MatCheckboxModule, typeof i58.MatCardModule, typeof i59.MatDatepickerModule, typeof i60.MatTimepickerModule, typeof i61.MatBadgeModule, typeof i62.MatExpansionModule, typeof i63.MatFormFieldModule, typeof i64.MatMenuModule, typeof i65.MatTooltipModule, typeof i66.DragDropModule], [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 ChartComponent, typeof SliderComponent, typeof SwitchComponent, typeof RichTextAreaComponent, typeof SkeletonTableLoadingComponent, typeof FlowConnection, typeof CircleProgressBar, typeof TreeDiagram, typeof TableCell, typeof KanbanBoardComponent, typeof DrawerComponent, typeof SkeletonListComponent, typeof SkeletonDetailComponent, typeof StatCardsComponent, typeof EmptyStateComponent, typeof FilterChipsComponent, typeof MeterComponent, typeof SectionCardComponent, typeof InfoFieldComponent, typeof SeverityBadgesComponent, typeof MasterDetailComponent, typeof ConfirmationDialogComponent, typeof i40.FormsModule, typeof i40.ReactiveFormsModule, typeof i41.RouterModule, typeof i42.OwlDateTimeModule, typeof i42.OwlNativeDateTimeModule, typeof HasPermissionDirective, typeof i46.NgHeroiconsModule, typeof i49.MatSelectModule, typeof i50.MatRadioModule, typeof i51.MatButtonModule, typeof i52.MatIconModule, typeof i53.MatPaginatorModule, typeof i54.MatTableModule, typeof i55.MatSnackBarModule, typeof i56.MatDialogModule, typeof i57.MatCheckboxModule, typeof i58.MatCardModule, typeof i59.MatDatepickerModule, typeof i60.MatTimepickerModule, typeof i61.MatBadgeModule, typeof i62.MatExpansionModule, typeof i63.MatFormFieldModule, typeof i64.MatMenuModule, typeof i65.MatTooltipModule, typeof i66.DragDropModule]>;
1097
1582
  static ɵinj: i0.ɵɵInjectorDeclaration<UiModule>;
1098
1583
  }
1099
1584
 
1100
- export { AuthInterceptor, AuthStateService, BaseComponent, BaseDialogComponent, BaseResolver, BaseTableComponent, BreadcrumbService, ButtonComponent, ChartComponent, CheckboxComponent, CircleProgressBar, ConfirmationDialogComponent, DatetimePicker, DndUploadComponent, DrawerComponent, FlowConnection, FxLoadingService, FxStorageService, FxToastrService, FxUtils, FxValidators, HasPermissionDirective, HeroIconComponent, HttpLoaderFactory, HttpWrapper, InputComponent, KanbanBoardComponent, LoadingPanel, MY_MOMENT_FORMATS, NotificationService, PermissionGuard, PermissionService, QuillStyleLoaderService, RadioButtonComponent, RadioButtonToggleComponent, RichTextAreaComponent, SearchBarComponent, SelectComponent, SkeletonTableLoadingComponent, SliderComponent, SwitchComponent, TabComponent, TabGroupComponent, TableCell, TagComponent, ThemeService, ToastComponent, ToastContainerComponent, TranslationModule, TranslationService, TreeDiagram, TrimOnBlurDirective, UiModule };
1101
- export type { Breadcrumb, ColumnChangedEvent, IChartType, IRadioButton, KanbanColumn, TableResult, TagType, ToastData, TreeNode, UploadResult };
1585
+ export { AuthInterceptor, AuthStateService, BaseComponent, BaseDialogComponent, BaseMasterDetailComponent, BaseResolver, BaseTableComponent, BreadcrumbService, ButtonComponent, ChartComponent, CheckboxComponent, CircleProgressBar, ConfirmationDialogComponent, DatetimePicker, DndUploadComponent, DrawerComponent, EmptyStateComponent, FilterChipsComponent, FlowConnection, FxLoadingService, FxStorageService, FxToastrService, FxUtils, FxValidators, HasPermissionDirective, HeroIconComponent, HttpLoaderFactory, HttpWrapper, InfoFieldComponent, InputComponent, KanbanBoardComponent, LoadingPanel, MY_MOMENT_FORMATS, MasterDetailComponent, MeterComponent, NotificationService, PermissionGuard, PermissionService, QuillStyleLoaderService, RadioButtonComponent, RadioButtonToggleComponent, RealtimeTableSync, RichTextAreaComponent, SearchBarComponent, SectionCardComponent, SelectComponent, SeverityBadgesComponent, SkeletonDetailComponent, SkeletonListComponent, SkeletonTableLoadingComponent, SliderComponent, StatCardsComponent, SwitchComponent, TabComponent, TabGroupComponent, TableCell, TagComponent, ThemeService, ToastComponent, ToastContainerComponent, TranslationModule, TranslationService, TreeDiagram, TrimOnBlurDirective, UiModule, countTone, createApi, fxListResolver, scoreTone, severityTone, toneBadge, toneBg, toneColor, toneText };
1586
+ export type { Breadcrumb, ColumnChangedEvent, FxApiClass, FxFilterChipOption, FxListRequest, FxListResolverContext, FxSeverityBadge, FxStatCard, IChartType, IRadioButton, KanbanColumn, NotificationCallback, NotificationConnectOptions, RealtimeTableEvent, RealtimeTableSyncOptions, TableResult, TagType, ToastData, Tone, TreeNode, UploadResult };