@foxeltech/angular-ui 0.3.1 → 0.7.44

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 (193) hide show
  1. package/archivo/archivo-400-latin-ext.woff2 +0 -0
  2. package/archivo/archivo-400-latin.woff2 +0 -0
  3. package/archivo/archivo-400-vietnamese.woff2 +0 -0
  4. package/archivo/archivo-500-latin-ext.woff2 +0 -0
  5. package/archivo/archivo-500-latin.woff2 +0 -0
  6. package/archivo/archivo-500-vietnamese.woff2 +0 -0
  7. package/archivo/archivo-600-latin-ext.woff2 +0 -0
  8. package/archivo/archivo-600-latin.woff2 +0 -0
  9. package/archivo/archivo-600-vietnamese.woff2 +0 -0
  10. package/archivo/archivo-700-latin-ext.woff2 +0 -0
  11. package/archivo/archivo-700-latin.woff2 +0 -0
  12. package/archivo/archivo-700-vietnamese.woff2 +0 -0
  13. package/components.css +12 -12
  14. package/dialogs.css +2 -2
  15. package/fesm2022/foxeltech-angular-ui-chart.mjs +560 -0
  16. package/fesm2022/foxeltech-angular-ui-chart.mjs.map +1 -0
  17. package/fesm2022/foxeltech-angular-ui-flow.mjs +211 -0
  18. package/fesm2022/foxeltech-angular-ui-flow.mjs.map +1 -0
  19. package/fesm2022/foxeltech-angular-ui-rich-text.mjs +156 -0
  20. package/fesm2022/foxeltech-angular-ui-rich-text.mjs.map +1 -0
  21. package/fesm2022/foxeltech-angular-ui.mjs +1580 -1409
  22. package/fesm2022/foxeltech-angular-ui.mjs.map +1 -1
  23. package/fonts.css +462 -138
  24. package/fx-icons.svg +97 -0
  25. package/ibm-plex-mono/ibm-plex-mono-400-cyrillic-ext.woff2 +0 -0
  26. package/ibm-plex-mono/ibm-plex-mono-400-cyrillic.woff2 +0 -0
  27. package/ibm-plex-mono/ibm-plex-mono-400-latin-ext.woff2 +0 -0
  28. package/ibm-plex-mono/ibm-plex-mono-400-latin.woff2 +0 -0
  29. package/ibm-plex-mono/ibm-plex-mono-400-vietnamese.woff2 +0 -0
  30. package/ibm-plex-mono/ibm-plex-mono-500-cyrillic-ext.woff2 +0 -0
  31. package/ibm-plex-mono/ibm-plex-mono-500-cyrillic.woff2 +0 -0
  32. package/ibm-plex-mono/ibm-plex-mono-500-latin-ext.woff2 +0 -0
  33. package/ibm-plex-mono/ibm-plex-mono-500-latin.woff2 +0 -0
  34. package/ibm-plex-mono/ibm-plex-mono-500-vietnamese.woff2 +0 -0
  35. package/ibm-plex-mono/ibm-plex-mono-600-cyrillic-ext.woff2 +0 -0
  36. package/ibm-plex-mono/ibm-plex-mono-600-cyrillic.woff2 +0 -0
  37. package/ibm-plex-mono/ibm-plex-mono-600-latin-ext.woff2 +0 -0
  38. package/ibm-plex-mono/ibm-plex-mono-600-latin.woff2 +0 -0
  39. package/ibm-plex-mono/ibm-plex-mono-600-vietnamese.woff2 +0 -0
  40. package/jetbrains-mono/jetbrains-mono-400-cyrillic-ext.woff2 +0 -0
  41. package/jetbrains-mono/jetbrains-mono-400-cyrillic.woff2 +0 -0
  42. package/jetbrains-mono/jetbrains-mono-400-greek.woff2 +0 -0
  43. package/jetbrains-mono/jetbrains-mono-400-latin-ext.woff2 +0 -0
  44. package/jetbrains-mono/jetbrains-mono-400-latin.woff2 +0 -0
  45. package/jetbrains-mono/jetbrains-mono-400-vietnamese.woff2 +0 -0
  46. package/jetbrains-mono/jetbrains-mono-500-cyrillic-ext.woff2 +0 -0
  47. package/jetbrains-mono/jetbrains-mono-500-cyrillic.woff2 +0 -0
  48. package/jetbrains-mono/jetbrains-mono-500-greek.woff2 +0 -0
  49. package/jetbrains-mono/jetbrains-mono-500-latin-ext.woff2 +0 -0
  50. package/jetbrains-mono/jetbrains-mono-500-latin.woff2 +0 -0
  51. package/jetbrains-mono/jetbrains-mono-500-vietnamese.woff2 +0 -0
  52. package/jetbrains-mono/jetbrains-mono-600-cyrillic-ext.woff2 +0 -0
  53. package/jetbrains-mono/jetbrains-mono-600-cyrillic.woff2 +0 -0
  54. package/jetbrains-mono/jetbrains-mono-600-greek.woff2 +0 -0
  55. package/jetbrains-mono/jetbrains-mono-600-latin-ext.woff2 +0 -0
  56. package/jetbrains-mono/jetbrains-mono-600-latin.woff2 +0 -0
  57. package/jetbrains-mono/jetbrains-mono-600-vietnamese.woff2 +0 -0
  58. package/jetbrains-mono/jetbrains-mono-700-cyrillic-ext.woff2 +0 -0
  59. package/jetbrains-mono/jetbrains-mono-700-cyrillic.woff2 +0 -0
  60. package/jetbrains-mono/jetbrains-mono-700-greek.woff2 +0 -0
  61. package/jetbrains-mono/jetbrains-mono-700-latin-ext.woff2 +0 -0
  62. package/jetbrains-mono/jetbrains-mono-700-latin.woff2 +0 -0
  63. package/jetbrains-mono/jetbrains-mono-700-vietnamese.woff2 +0 -0
  64. package/newsreader/newsreader-400-latin-ext.woff2 +0 -0
  65. package/newsreader/newsreader-400-latin.woff2 +0 -0
  66. package/newsreader/newsreader-400-vietnamese.woff2 +0 -0
  67. package/newsreader/newsreader-500-latin-ext.woff2 +0 -0
  68. package/newsreader/newsreader-500-latin.woff2 +0 -0
  69. package/newsreader/newsreader-500-vietnamese.woff2 +0 -0
  70. package/newsreader/newsreader-600-latin-ext.woff2 +0 -0
  71. package/newsreader/newsreader-600-latin.woff2 +0 -0
  72. package/newsreader/newsreader-600-vietnamese.woff2 +0 -0
  73. package/package.json +18 -9
  74. package/source-serif-4/source-serif-4-400-cyrillic-ext.woff2 +0 -0
  75. package/source-serif-4/source-serif-4-400-cyrillic.woff2 +0 -0
  76. package/source-serif-4/source-serif-4-400-greek.woff2 +0 -0
  77. package/source-serif-4/source-serif-4-400-latin-ext.woff2 +0 -0
  78. package/source-serif-4/source-serif-4-400-latin.woff2 +0 -0
  79. package/source-serif-4/source-serif-4-400-vietnamese.woff2 +0 -0
  80. package/source-serif-4/source-serif-4-600-cyrillic-ext.woff2 +0 -0
  81. package/source-serif-4/source-serif-4-600-cyrillic.woff2 +0 -0
  82. package/source-serif-4/source-serif-4-600-greek.woff2 +0 -0
  83. package/source-serif-4/source-serif-4-600-latin-ext.woff2 +0 -0
  84. package/source-serif-4/source-serif-4-600-latin.woff2 +0 -0
  85. package/source-serif-4/source-serif-4-600-vietnamese.woff2 +0 -0
  86. package/src/lib/styles/components.css +12 -12
  87. package/src/lib/styles/dialogs.css +2 -2
  88. package/src/lib/styles/fonts.css +462 -138
  89. package/src/lib/styles/tailwind.css +1 -2
  90. package/src/lib/styles/theme.css +596 -69
  91. package/src/lib/styles/tokens.css +56 -19
  92. package/src/lib/styles/utilities.css +4 -1
  93. package/src/lib/ui/components/bar-list/bar-list.component.html +29 -0
  94. package/src/lib/ui/components/button/button.component.html +20 -18
  95. package/src/lib/ui/components/checkbox/checkbox.component.html +3 -3
  96. package/src/lib/ui/components/circle-progress-bar/circle-progress-bar.component.html +2 -2
  97. package/src/lib/ui/components/code-block/code-block.component.html +8 -0
  98. package/src/lib/ui/components/datetime-picker/datetime-picker.component.html +49 -27
  99. package/src/lib/ui/components/datetime-picker/datetime-picker.component.scss +25 -137
  100. package/src/lib/ui/components/dnd-upload/dnd-upload.component.html +3 -3
  101. package/src/lib/ui/components/drawer/drawer.component.html +36 -13
  102. package/src/lib/ui/components/drawer/drawer.component.scss +104 -18
  103. package/src/lib/ui/components/empty-state/empty-state.component.html +2 -2
  104. package/src/lib/ui/components/facets-rail/facets-rail.component.html +42 -0
  105. package/src/lib/ui/components/filter-pills/filter-pills.component.html +16 -0
  106. package/src/lib/ui/components/hero-icon/hero-icon.component.html +10 -9
  107. package/src/lib/ui/components/info-field/info-field.component.html +1 -1
  108. package/src/lib/ui/components/input/input.component.html +6 -6
  109. package/src/lib/ui/components/kanban-board/kanban-board.component.html +1 -1
  110. package/src/lib/ui/components/kanban-board/kanban-board.component.scss +9 -9
  111. package/src/lib/ui/components/list-row/list-row.component.html +20 -0
  112. package/src/lib/ui/components/loading-panel/loading-panel.component.html +1 -1
  113. package/src/lib/ui/components/master-detail/master-detail.component.css +22 -0
  114. package/src/lib/ui/components/master-detail/master-detail.component.html +42 -10
  115. package/src/lib/ui/components/menu/menu.component.html +27 -0
  116. package/src/lib/ui/components/pending-badge/pending-badge.component.html +15 -0
  117. package/src/lib/ui/components/pipeline-stepper/pipeline-stepper.component.html +45 -0
  118. package/src/lib/ui/components/project-card/project-card.component.html +102 -0
  119. package/src/lib/ui/components/radio-button/radio-button.component.html +4 -4
  120. package/src/lib/ui/components/radio-button-toggle/radio-button-toggle.component.html +4 -4
  121. package/src/lib/ui/components/sample-frame/sample-frame.component.html +18 -0
  122. package/src/lib/ui/components/score-badge/score-badge.component.html +7 -0
  123. package/src/lib/ui/components/screenshot-frame/screenshot-frame.component.html +40 -0
  124. package/src/lib/ui/components/search-bar/search-bar.component.html +1 -1
  125. package/src/lib/ui/components/section-card/section-card.component.html +19 -6
  126. package/src/lib/ui/components/segmented/segmented.component.html +42 -0
  127. package/src/lib/ui/components/segmented/segmented.component.scss +12 -0
  128. package/src/lib/ui/components/select/select.component.html +6 -6
  129. package/src/lib/ui/components/skeleton-detail/skeleton-detail.component.html +2 -2
  130. package/src/lib/ui/components/skeleton-list/skeleton-list.component.html +1 -1
  131. package/src/lib/ui/components/skeleton-table-loading/skeleton-table-loading.component.html +5 -5
  132. package/src/lib/ui/components/slider/slider.component.html +8 -8
  133. package/src/lib/ui/components/sparkbar/sparkbar.component.html +14 -0
  134. package/src/lib/ui/components/stage-dots/stage-dots.component.html +13 -0
  135. package/src/lib/ui/components/stat-cards/stat-cards.component.html +45 -12
  136. package/src/lib/ui/components/status-dot/status-dot.component.html +13 -0
  137. package/src/lib/ui/components/switch/switch.component.html +1 -1
  138. package/src/lib/ui/components/tab-group/tab-group.component.html +41 -12
  139. package/src/lib/ui/components/tab-group/tab-group.component.scss +41 -1
  140. package/src/lib/ui/components/table-cell/table-cell.component.html +2 -2
  141. package/src/lib/ui/components/tag/tag.component.html +4 -4
  142. package/src/lib/ui/components/theme-picker/theme-picker.component.html +44 -0
  143. package/src/lib/ui/components/toast/toast.component.html +7 -7
  144. package/src/lib/ui/components/toast-container/toast-container.component.html +1 -0
  145. package/src/lib/ui/components/tree-diagram/tree-diagram.component.html +5 -5
  146. package/tailwind.css +1 -2
  147. package/theme.css +596 -69
  148. package/tokens.css +56 -19
  149. package/types/foxeltech-angular-ui-chart.d.ts +65 -0
  150. package/types/foxeltech-angular-ui-flow.d.ts +96 -0
  151. package/types/foxeltech-angular-ui-rich-text.d.ts +35 -0
  152. package/types/foxeltech-angular-ui.d.ts +1018 -395
  153. package/utilities.css +4 -1
  154. package/BeVietnamPro/BeVietnamPro-Bold.woff2 +0 -0
  155. package/BeVietnamPro/BeVietnamPro-ExtraLight.woff2 +0 -0
  156. package/BeVietnamPro/BeVietnamPro-Light.woff2 +0 -0
  157. package/BeVietnamPro/BeVietnamPro-Medium.woff2 +0 -0
  158. package/BeVietnamPro/BeVietnamPro-Regular.woff2 +0 -0
  159. package/BeVietnamPro/BeVietnamPro-SemiBold.woff2 +0 -0
  160. package/BeVietnamPro/BeVietnamPro-Thin.woff2 +0 -0
  161. package/SpaceMono-Regular.woff2 +0 -0
  162. package/dm-sans/DMSans-Bold.woff2 +0 -0
  163. package/dm-sans/DMSans-Light.woff2 +0 -0
  164. package/dm-sans/DMSans-Medium.woff2 +0 -0
  165. package/dm-sans/DMSans-Regular.woff2 +0 -0
  166. package/dm-sans/DMSans-SemiBold.woff2 +0 -0
  167. package/dm-sans/DMSans-Thin.woff2 +0 -0
  168. package/orbitron/Orbitron-Bold.woff2 +0 -0
  169. package/orbitron/Orbitron-Medium.woff2 +0 -0
  170. package/orbitron/Orbitron-Regular.woff2 +0 -0
  171. package/orbitron/Orbitron-SemiBold.woff2 +0 -0
  172. package/roboto/Roboto-Black.woff2 +0 -0
  173. package/roboto/Roboto-BlackItalic.woff2 +0 -0
  174. package/roboto/Roboto-Bold.woff2 +0 -0
  175. package/roboto/Roboto-BoldCondensed.woff2 +0 -0
  176. package/roboto/Roboto-BoldCondensedItalic.woff2 +0 -0
  177. package/roboto/Roboto-BoldItalic.woff2 +0 -0
  178. package/roboto/Roboto-Condensed.woff2 +0 -0
  179. package/roboto/Roboto-CondensedItalic.woff2 +0 -0
  180. package/roboto/Roboto-Italic.woff2 +0 -0
  181. package/roboto/Roboto-Light.woff2 +0 -0
  182. package/roboto/Roboto-LightItalic.woff2 +0 -0
  183. package/roboto/Roboto-Medium.woff2 +0 -0
  184. package/roboto/Roboto-MediumItalic.woff2 +0 -0
  185. package/roboto/Roboto-Regular.woff2 +0 -0
  186. package/roboto/Roboto-Thin.woff2 +0 -0
  187. package/roboto/Roboto-ThinItalic.woff2 +0 -0
  188. package/src/lib/ui/components/chart/chart.component.html +0 -20
  189. package/src/lib/ui/components/chart/chart.component.scss +0 -49
  190. package/src/lib/ui/components/flow-connection/flow-connection.component.html +0 -10
  191. package/src/lib/ui/components/flow-connection/flow-connection.component.scss +0 -0
  192. package/src/lib/ui/components/rich-text-area/rich-text-area.component.html +0 -3
  193. package/src/lib/ui/components/rich-text-area/rich-text-area.component.scss +0 -18
@@ -1,46 +1,21 @@
1
- import * as i0 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';
1
+ import * as _angular_core from '@angular/core';
2
+ import { OnDestroy, Injector, DestroyRef, ApplicationRef, OnInit, AfterViewInit, ChangeDetectorRef, Type, EventEmitter, Provider, ModuleWithProviders, TemplateRef, ViewContainerRef, ElementRef, RendererFactory2, OnChanges, SimpleChanges, AfterContentInit, AfterViewChecked, Renderer2, InjectionToken, QueryList, NgZone } from '@angular/core';
3
3
  import * as _foxeltech_angular_ui from '@foxeltech/angular-ui';
4
- import * as i53 from '@angular/material/paginator';
5
- import { MatPaginator } from '@angular/material/paginator';
6
- import * as i54 from '@angular/material/table';
4
+ import { MatDialog, MatDialogRef, MatDialogConfig } from '@angular/material/dialog';
5
+ import { MatPaginator, PageEvent } from '@angular/material/paginator';
7
6
  import { MatTableDataSource, MatTable } from '@angular/material/table';
8
7
  import { HttpClient, HttpEvent, HttpErrorResponse, HttpInterceptor, HttpRequest, HttpHandler } from '@angular/common/http';
9
8
  import * as rxjs from 'rxjs';
10
9
  import { Observable, Subject } from 'rxjs';
11
- import * as i40 from '@angular/forms';
12
- import { NgForm, ValidationErrors, NgControl, ControlValueAccessor } from '@angular/forms';
13
- import * as i56 from '@angular/material/dialog';
14
- import { MatDialogRef, MatDialog } from '@angular/material/dialog';
15
- import * as i41 from '@angular/router';
10
+ import * as i1$1 from '@angular/forms';
11
+ import { NgForm, ValidationErrors, ControlValueAccessor, NgControl } from '@angular/forms';
12
+ import * as i2 from '@angular/router';
16
13
  import { ActivatedRouteSnapshot, RouterStateSnapshot, ResolveFn, CanActivate, Router } from '@angular/router';
17
14
  import { TranslateHttpLoader } from '@ngx-translate/http-loader';
18
15
  import * as i1 from '@ngx-translate/core';
19
16
  import { TranslateService } from '@ngx-translate/core';
20
- import { EChartsOption, ECharts } from 'echarts';
21
- import * as i47 from 'ngx-vflow';
22
- import { Node, Edge, Connection } from 'ngx-vflow';
23
- import * as i66 from '@angular/cdk/drag-drop';
17
+ import { ComponentType } from '@angular/cdk/portal';
24
18
  import { CdkDragDrop } from '@angular/cdk/drag-drop';
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
19
 
45
20
  declare abstract class BaseComponent implements OnDestroy {
46
21
  protected injector: Injector;
@@ -48,8 +23,8 @@ declare abstract class BaseComponent implements OnDestroy {
48
23
  protected destroyRef: DestroyRef;
49
24
  constructor(injector?: Injector);
50
25
  ngOnDestroy(): void;
51
- static ɵfac: i0.ɵɵFactoryDeclaration<BaseComponent, never>;
52
- static ɵdir: i0.ɵɵDirectiveDeclaration<BaseComponent, never, never, {}, {}, never, never, true, never>;
26
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BaseComponent, never>;
27
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BaseComponent, never, never, {}, {}, never, never, true, never>;
53
28
  }
54
29
 
55
30
  declare class HttpWrapper {
@@ -103,26 +78,45 @@ declare class FxToastrService {
103
78
  error(message: string, title?: string): void;
104
79
  info(message: string, title?: string): void;
105
80
  warning(message: string, title?: string): void;
106
- static ɵfac: i0.ɵɵFactoryDeclaration<FxToastrService, never>;
107
- static ɵprov: i0.ɵɵInjectableDeclaration<FxToastrService>;
81
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FxToastrService, never>;
82
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<FxToastrService>;
108
83
  }
109
84
 
110
85
  interface TableResult<T> {
111
86
  data: T[];
112
87
  total: number;
113
88
  }
89
+ /**
90
+ * Filter bag for BaseTable screens. The platform-wide keys are declared so
91
+ * templates keep dot access under noPropertyAccessFromIndexSignature;
92
+ * screen-specific keys ride on the index signature (bracket access).
93
+ */
94
+ interface FxTableFilters {
95
+ keyword?: string;
96
+ status?: string;
97
+ statuses?: string[];
98
+ severity?: string;
99
+ riskLevel?: string;
100
+ priority?: string;
101
+ category?: string;
102
+ integrityLevel?: string;
103
+ tags?: string[];
104
+ name?: string;
105
+ groupId?: string;
106
+ [key: string]: any;
107
+ }
114
108
  declare class BaseTableComponent<T = any> extends BaseComponent implements OnInit, AfterViewInit {
115
109
  api: HttpWrapper;
116
- modal: any;
110
+ modal: MatDialog;
117
111
  ref: ChangeDetectorRef;
118
112
  dataSource: MatTableDataSource<T, MatPaginator>;
119
113
  cols: string[];
120
114
  total: number;
121
115
  page: number;
122
116
  pageSize: number;
123
- filters: any;
117
+ filters: FxTableFilters;
124
118
  loading: boolean;
125
- expandedElement: any | null;
119
+ expandedElement: T | null;
126
120
  toastr: FxToastrService;
127
121
  _lock: boolean;
128
122
  keywordChange$: Subject<string>;
@@ -164,8 +158,8 @@ declare class BaseTableComponent<T = any> extends BaseComponent implements OnIni
164
158
  };
165
159
  };
166
160
  paginator: MatPaginator;
167
- table: MatTable<T>;
168
- constructor(injector: Injector, api: HttpWrapper, modal: any, ref: ChangeDetectorRef);
161
+ readonly table: _angular_core.Signal<MatTable<any>>;
162
+ constructor(injector: Injector, api: HttpWrapper, modal: MatDialog, ref: ChangeDetectorRef);
169
163
  ngOnInit(): void;
170
164
  init(): void;
171
165
  ngAfterViewInit(): void;
@@ -186,22 +180,22 @@ declare class BaseTableComponent<T = any> extends BaseComponent implements OnIni
186
180
  setDataSource(result: any): void;
187
181
  private _fetchSeq;
188
182
  fetch(): Promise<void>;
189
- onPageChange(event: any): Promise<void>;
183
+ onPageChange(event: PageEvent): Promise<void>;
190
184
  resolve(): {};
191
185
  empty(): {};
192
186
  onKeywordChange(keyword: string): void;
193
187
  create(): Promise<void>;
194
- update(model: any): Promise<void>;
195
- view(model: any): Promise<void>;
196
- delete(model: any): Promise<void>;
197
- remove(model: any): Promise<any>;
188
+ update(model: T): Promise<void>;
189
+ view(model: T): Promise<void>;
190
+ delete(model: T): Promise<void>;
191
+ remove(model: T): Promise<any>;
198
192
  tagClass(tag: string): _foxeltech_angular_ui.TagType;
199
193
  capitalize(label: string): string;
200
194
  value(model: any, key: string, defaultValue?: any): any;
201
195
  toggleExpand(element: any): void;
202
196
  updateStatus(params: any): Promise<void>;
203
- static ɵfac: i0.ɵɵFactoryDeclaration<BaseTableComponent<any>, never>;
204
- static ɵdir: i0.ɵɵDirectiveDeclaration<BaseTableComponent<any>, never, never, {}, {}, never, never, true, never>;
197
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BaseTableComponent<any>, never>;
198
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BaseTableComponent<any>, never, never, {}, {}, never, never, true, never>;
205
199
  }
206
200
 
207
201
  /**
@@ -221,10 +215,10 @@ declare class BaseMasterDetailComponent<T = any> extends BaseTableComponent<T> {
221
215
  selected: T | null;
222
216
  detailMap: Map<string, any>;
223
217
  detailLoading: Set<string>;
224
- constructor(injector: Injector, api: HttpWrapper, modal: any, ref: ChangeDetectorRef);
218
+ constructor(injector: Injector, api: HttpWrapper, modal: MatDialog, ref: ChangeDetectorRef);
225
219
  /** Key the row id is read from. Override idOf() instead for composite ids. */
226
220
  protected idKey: string;
227
- idOf(row: any): string | null;
221
+ idOf(row: T): string | null;
228
222
  protected detailUrl(id: string): string | null;
229
223
  /** What the detail pane shows: the fetched detail when cached, else the row. */
230
224
  get detail(): any;
@@ -234,8 +228,8 @@ declare class BaseMasterDetailComponent<T = any> extends BaseTableComponent<T> {
234
228
  autoSelectFirst(): void;
235
229
  selectItem(row: T): void;
236
230
  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>;
231
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BaseMasterDetailComponent<any>, never>;
232
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BaseMasterDetailComponent<any>, never, never, {}, {}, never, never, true, never>;
239
233
  }
240
234
 
241
235
  declare class BaseDialogComponent<T = any> extends BaseComponent implements AfterViewInit, OnInit {
@@ -244,7 +238,7 @@ declare class BaseDialogComponent<T = any> extends BaseComponent implements Afte
244
238
  toastr: FxToastrService;
245
239
  api: HttpWrapper;
246
240
  dialog: MatDialog;
247
- ngForm: NgForm;
241
+ readonly ngForm: _angular_core.Signal<NgForm | undefined>;
248
242
  method: string;
249
243
  title: string;
250
244
  model: any;
@@ -263,8 +257,8 @@ declare class BaseDialogComponent<T = any> extends BaseComponent implements Afte
263
257
  updateInfo(params?: any): Promise<void>;
264
258
  cancel(): void;
265
259
  validate(): boolean;
266
- static ɵfac: i0.ɵɵFactoryDeclaration<BaseDialogComponent<any>, never>;
267
- static ɵdir: i0.ɵɵDirectiveDeclaration<BaseDialogComponent<any>, never, never, {}, {}, never, never, true, never>;
260
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BaseDialogComponent<any>, never>;
261
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BaseDialogComponent<any>, never, never, {}, {}, never, never, true, never>;
268
262
  }
269
263
 
270
264
  declare class FxLoadingService {
@@ -274,8 +268,8 @@ declare class FxLoadingService {
274
268
  stop(): void;
275
269
  startAction(): void;
276
270
  stopAction(): void;
277
- static ɵfac: i0.ɵɵFactoryDeclaration<FxLoadingService, never>;
278
- static ɵprov: i0.ɵɵInjectableDeclaration<FxLoadingService>;
271
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FxLoadingService, never>;
272
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<FxLoadingService>;
279
273
  }
280
274
 
281
275
  declare class BaseResolver {
@@ -402,8 +396,8 @@ declare class NotificationService {
402
396
  * Get connection ID
403
397
  */
404
398
  getConnectionId(): string | null;
405
- static ɵfac: i0.ɵɵFactoryDeclaration<NotificationService, never>;
406
- static ɵprov: i0.ɵɵInjectableDeclaration<NotificationService>;
399
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NotificationService, never>;
400
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<NotificationService>;
407
401
  }
408
402
 
409
403
  interface RealtimeTableEvent<T> {
@@ -482,6 +476,14 @@ declare class RealtimeTableSync<T = any> {
482
476
  }
483
477
 
484
478
  declare class FxUtils {
479
+ /** Dot-path accessor (lodash _.get replacement — supports 'a.b.c'). */
480
+ static get(obj: any, path: string, defaultValue?: any): any;
481
+ /** Dot-path setter (lodash _.set replacement — creates missing objects). */
482
+ static set(obj: any, path: string, value: any): any;
483
+ /** Structural equality (lodash _.isEqual replacement for plain data). */
484
+ static deepEqual(a: any, b: any): boolean;
485
+ /** Deep clone for plain data (objects/arrays/Date); functions stay by reference. */
486
+ static cloneDeep<T>(v: T): T;
485
487
  private static preresolve;
486
488
  static resolve(value: object): Promise<{}>;
487
489
  static isNotNull(obj: any): boolean;
@@ -507,6 +509,14 @@ declare class FxUtils {
507
509
  static convertColorFromVariable(name: string, alpha?: number, options?: {
508
510
  legacyCommaSyntax?: boolean;
509
511
  }): string;
512
+ /**
513
+ * Status/severity string → tag tone.
514
+ *
515
+ * Coerces instead of trusting the argument: every caller feeds this raw API
516
+ * values, and a numeric or null field used to throw
517
+ * "key.toLowerCase is not a function" and take the whole screen down.
518
+ * Non-string input simply falls through to the default tone.
519
+ */
510
520
  static getTagClass(key: string, isCriticalExist?: boolean): TagType;
511
521
  static validateEmail(value: string): boolean;
512
522
  /** Safe deep accessor with the org-wide empty placeholder. */
@@ -578,6 +588,25 @@ declare function toneBadge(tone: Tone | null): string;
578
588
  */
579
589
  declare function toneColor(tone: Tone | null, alpha?: number): string;
580
590
 
591
+ /**
592
+ * Feature gating for the V2 rollout.
593
+ *
594
+ * Each app owns its own `environment.features` block, so the flags are passed
595
+ * in rather than read here — the library has no environment of its own.
596
+ *
597
+ * readonly knowledge = featureEnabled(environment.features, 'knowledge');
598
+ *
599
+ * Why a helper instead of `environment.features?.x`: call sites were drifting
600
+ * between truthy checks and `=== true`, some behind an `as any` cast that hides
601
+ * a typo in the flag name. One function keeps the semantics identical
602
+ * everywhere — a flag counts as on only when it is exactly `true`, so a missing
603
+ * block, a missing key or a stale string value all read as off.
604
+ */
605
+ type FxFeatureFlags = Record<string, boolean | undefined> | undefined | null;
606
+ declare function featureEnabled(flags: FxFeatureFlags, name: string): boolean;
607
+ /** Convenience for templates that gate on several flags at once. */
608
+ declare function anyFeatureEnabled(flags: FxFeatureFlags, ...names: string[]): boolean;
609
+
581
610
  declare class FxValidators {
582
611
  /**
583
612
  * Name fields: firstName, lastName, groupName, projectName, displayName
@@ -639,9 +668,9 @@ declare function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader;
639
668
  declare class TranslationModule {
640
669
  static forRoot(): ModuleWithProviders<TranslationModule>;
641
670
  static forChild(): ModuleWithProviders<TranslationModule>;
642
- static ɵfac: i0.ɵɵFactoryDeclaration<TranslationModule, never>;
643
- static ɵmod: i0.ɵɵNgModuleDeclaration<TranslationModule, never, [typeof i1.TranslateModule], [typeof i1.TranslateModule]>;
644
- static ɵinj: i0.ɵɵInjectorDeclaration<TranslationModule>;
671
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TranslationModule, never>;
672
+ static ɵmod: _angular_core.ɵɵNgModuleDeclaration<TranslationModule, never, [typeof i1.TranslateModule], [typeof i1.TranslateModule]>;
673
+ static ɵinj: _angular_core.ɵɵInjectorDeclaration<TranslationModule>;
645
674
  }
646
675
 
647
676
  declare class TranslationService {
@@ -655,8 +684,8 @@ declare class TranslationService {
655
684
  setLanguage(lang: string): void;
656
685
  loadTranslations(lang: string, path: string): void;
657
686
  onLanguageChange(callback: (lang: string) => void): void;
658
- static ɵfac: i0.ɵɵFactoryDeclaration<TranslationService, never>;
659
- static ɵprov: i0.ɵɵInjectableDeclaration<TranslationService>;
687
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TranslationService, never>;
688
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<TranslationService>;
660
689
  }
661
690
 
662
691
  declare class PermissionService {
@@ -664,8 +693,8 @@ declare class PermissionService {
664
693
  setPermissions(perms: string[]): void;
665
694
  hasPermission(requiredPermissions: string[]): boolean;
666
695
  getPermissions(): string[];
667
- static ɵfac: i0.ɵɵFactoryDeclaration<PermissionService, never>;
668
- static ɵprov: i0.ɵɵInjectableDeclaration<PermissionService>;
696
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PermissionService, never>;
697
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<PermissionService>;
669
698
  }
670
699
 
671
700
  declare class HasPermissionDirective {
@@ -674,18 +703,18 @@ declare class HasPermissionDirective {
674
703
  private permissionService;
675
704
  constructor(templateRef: TemplateRef<any>, viewContainerRef: ViewContainerRef, permissionService: PermissionService);
676
705
  set hasPermission(required: string | string[]);
677
- static ɵfac: i0.ɵɵFactoryDeclaration<HasPermissionDirective, never>;
678
- static ɵdir: i0.ɵɵDirectiveDeclaration<HasPermissionDirective, "[hasPermission]", never, { "hasPermission": { "alias": "hasPermission"; "required": false; }; }, {}, never, never, true, never>;
706
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HasPermissionDirective, never>;
707
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<HasPermissionDirective, "[hasPermission]", never, { "hasPermission": { "alias": "hasPermission"; "required": false; }; }, {}, never, never, true, never>;
679
708
  }
680
709
 
681
710
  declare class TrimOnBlurDirective {
682
711
  private el;
712
+ readonly collapseWhitespace: _angular_core.InputSignal<boolean>;
683
713
  private ngControl;
684
- collapseWhitespace: boolean;
685
- constructor(el: ElementRef<HTMLInputElement>, ngControl: NgControl);
714
+ constructor(el: ElementRef<HTMLInputElement>);
686
715
  onBlur(): void;
687
- static ɵfac: i0.ɵɵFactoryDeclaration<TrimOnBlurDirective, never>;
688
- static ɵdir: i0.ɵɵDirectiveDeclaration<TrimOnBlurDirective, "[appTrimOnBlur]", never, { "collapseWhitespace": { "alias": "appTrimOnBlurCollapse"; "required": false; }; }, {}, never, never, true, never>;
716
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TrimOnBlurDirective, never>;
717
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TrimOnBlurDirective, "[appTrimOnBlur]", never, { "collapseWhitespace": { "alias": "appTrimOnBlurCollapse"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
689
718
  }
690
719
 
691
720
  declare class PermissionGuard implements CanActivate {
@@ -693,15 +722,15 @@ declare class PermissionGuard implements CanActivate {
693
722
  private router;
694
723
  constructor(permissionService: PermissionService, router: Router);
695
724
  canActivate(route: any): boolean;
696
- static ɵfac: i0.ɵɵFactoryDeclaration<PermissionGuard, never>;
697
- static ɵprov: i0.ɵɵInjectableDeclaration<PermissionGuard>;
725
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PermissionGuard, never>;
726
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<PermissionGuard>;
698
727
  }
699
728
 
700
729
  declare class FxStorageService {
701
730
  resolve(key: string, value?: any): any;
702
731
  remove(key: string): void;
703
- static ɵfac: i0.ɵɵFactoryDeclaration<FxStorageService, never>;
704
- static ɵprov: i0.ɵɵInjectableDeclaration<FxStorageService>;
732
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FxStorageService, never>;
733
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<FxStorageService>;
705
734
  }
706
735
 
707
736
  declare class AuthStateService {
@@ -712,8 +741,8 @@ declare class AuthStateService {
712
741
  setLoggedIn(value: boolean): void;
713
742
  get isLoggedIn(): boolean;
714
743
  handleUnauthorized(): void;
715
- static ɵfac: i0.ɵɵFactoryDeclaration<AuthStateService, never>;
716
- static ɵprov: i0.ɵɵInjectableDeclaration<AuthStateService>;
744
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AuthStateService, never>;
745
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AuthStateService>;
717
746
  }
718
747
 
719
748
  declare class AuthInterceptor implements HttpInterceptor {
@@ -721,8 +750,8 @@ declare class AuthInterceptor implements HttpInterceptor {
721
750
  private handlingUnauthorized;
722
751
  constructor(authState: AuthStateService);
723
752
  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>;
724
- static ɵfac: i0.ɵɵFactoryDeclaration<AuthInterceptor, never>;
725
- static ɵprov: i0.ɵɵInjectableDeclaration<AuthInterceptor>;
753
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AuthInterceptor, never>;
754
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AuthInterceptor>;
726
755
  }
727
756
 
728
757
  interface Breadcrumb {
@@ -735,38 +764,81 @@ declare class BreadcrumbService {
735
764
  set(breadcrumbs: Breadcrumb[]): void;
736
765
  get(): rxjs.Observable<Breadcrumb[]>;
737
766
  clear(): void;
738
- static ɵfac: i0.ɵɵFactoryDeclaration<BreadcrumbService, never>;
739
- static ɵprov: i0.ɵɵInjectableDeclaration<BreadcrumbService>;
767
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BreadcrumbService, never>;
768
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<BreadcrumbService>;
740
769
  }
741
770
 
742
- declare class QuillStyleLoaderService {
743
- private platformId;
744
- private loaded;
745
- private loadingPromise;
746
- constructor(platformId: object);
747
- /**
748
- * Load Quill CSS (only in browser). Returns a promise that resolves when
749
- * the CSS links have been appended.
750
- */
751
- load(): Promise<void>;
752
- static ɵfac: i0.ɵɵFactoryDeclaration<QuillStyleLoaderService, never>;
753
- static ɵprov: i0.ɵɵInjectableDeclaration<QuillStyleLoaderService>;
771
+ /** The six OgeniumDashboards themes. */
772
+ type OgTheme = 'porcelain' | 'charcoal' | 'ivory' | 'studio' | 'blueprint' | 'terminal';
773
+ declare const OG_THEMES: readonly OgTheme[];
774
+ declare const OG_LIGHT_THEMES: readonly OgTheme[];
775
+ /** Display metadata for theme pickers — accent/page swatches are brand constants. */
776
+ interface OgThemeMeta {
777
+ name: OgTheme;
778
+ label: string;
779
+ accent: string;
780
+ pageBg: string;
781
+ dark: boolean;
754
782
  }
755
-
783
+ declare const OG_THEME_META: readonly OgThemeMeta[];
784
+ /**
785
+ * Theme NGƯỜI DÙNG được chọn (anh Tú chốt 31/08): chỉ còn một cặp
786
+ * light/dark. Bốn theme còn lại vẫn tồn tại đầy đủ trong theme.css và
787
+ * setTheme() vẫn nhận — chúng dùng cho trang /themes của demo và cho
788
+ * harness screenshot chạy ma trận 6 theme; chỉ **giấu khỏi picker**.
789
+ * Muốn mở lại: thêm tên vào mảng này, không phải dựng lại token.
790
+ */
791
+ declare const OG_PICKER_THEMES: readonly OgTheme[];
792
+ /** OG_THEME_META đã lọc theo OG_PICKER_THEMES — nguồn duy nhất cho mọi picker. */
793
+ declare const OG_PICKER_THEME_META: readonly OgThemeMeta[];
794
+ /**
795
+ * V2 theme switching: one `data-og-theme` attribute on <html> selects the
796
+ * --og-* token block (theme.css). During the migration window the service
797
+ * also mirrors the legacy `light_theme` class on <body> so remotes built
798
+ * against the pre-V2 stylesheet keep resolving the correct palette
799
+ * (see the SKEW SHIELD note in theme.css).
800
+ */
756
801
  declare class ThemeService {
757
802
  private renderer;
758
803
  private lightClass;
759
804
  private theme$;
760
805
  themeStorageKey: string;
761
806
  constructor(rendererFactory: RendererFactory2);
807
+ /** Primary API: activate one of the six V2 themes. */
808
+ setTheme(theme: OgTheme): void;
809
+ themeChanges(): Observable<OgTheme>;
810
+ getCurrentTheme(): OgTheme;
811
+ isLight(): boolean;
812
+ /** @deprecated V2: use setTheme(). Maps light→porcelain, dark→charcoal. */
762
813
  setLightMode(enable: boolean): void;
814
+ /** @deprecated V2: use setTheme(). Flips between the two default themes. */
763
815
  toggleTheme(): void;
764
- themeChanges(): rxjs.Observable<"light" | "dark">;
765
- getCurrentTheme(): 'light' | 'dark';
766
- isLight(): boolean;
767
816
  getLogoPath(): string;
768
- static ɵfac: i0.ɵɵFactoryDeclaration<ThemeService, never>;
769
- static ɵprov: i0.ɵɵInjectableDeclaration<ThemeService>;
817
+ private isLightTheme;
818
+ private readSavedTheme;
819
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ThemeService, never>;
820
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ThemeService>;
821
+ }
822
+
823
+ interface FxConfirmOptions {
824
+ title?: string;
825
+ message?: string;
826
+ confirmLabel?: string;
827
+ cancelLabel?: string;
828
+ }
829
+ /**
830
+ * Thin façade over MatDialog so app code never imports @angular/material
831
+ * directly (behavior-layer rule, Playbook §5.1). Same semantics — the
832
+ * returned ref is the Material one, typed through this service.
833
+ */
834
+ declare class FxDialogService {
835
+ private dialog;
836
+ open<T, D = any, R = any>(component: ComponentType<T> | TemplateRef<T>, config?: MatDialogConfig<D>): MatDialogRef<T, R>;
837
+ /** Standard confirmation flow — resolves true when the user confirms. */
838
+ confirm(options?: FxConfirmOptions): Promise<boolean>;
839
+ closeAll(): void;
840
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FxDialogService, never>;
841
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<FxDialogService>;
770
842
  }
771
843
 
772
844
  type ErrorMessages = Record<string, any>;
@@ -778,6 +850,9 @@ declare abstract class FxComponent<T> implements ControlValueAccessor {
778
850
  * bind to an ancestor's NgControl.
779
851
  */
780
852
  ngControl: NgControl | null;
853
+ /** With OnPush, programmatic writes (form.setValue / setDisabledState) must
854
+ * mark the view — CVA calls come from outside the component's own events. */
855
+ protected cdr: ChangeDetectorRef;
781
856
  disabled: boolean;
782
857
  value: T;
783
858
  onChange: (value: T) => void;
@@ -802,8 +877,8 @@ declare abstract class FxComponent<T> implements ControlValueAccessor {
802
877
  */
803
878
  clearErrors(): void;
804
879
  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>;
880
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FxComponent<any>, never>;
881
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FxComponent<any>, never, never, { "disabled": { "alias": "disabled"; "required": false; }; }, {}, never, never, true, never>;
807
882
  }
808
883
 
809
884
  declare class InputComponent extends FxComponent<string> implements AfterViewInit {
@@ -811,18 +886,18 @@ declare class InputComponent extends FxComponent<string> implements AfterViewIni
811
886
  label: string;
812
887
  tooltip: string;
813
888
  type: string;
814
- placeholder: string;
889
+ readonly placeholder: _angular_core.InputSignal<string>;
815
890
  errorMessages: Record<string, string>;
816
- required: string | boolean;
891
+ readonly required: _angular_core.InputSignal<string | boolean>;
817
892
  suffixIcon?: string;
818
- class?: any;
819
- maxlength?: number;
820
- validateFn?: (value: string) => ValidationErrors | null;
821
- blurred: EventEmitter<void>;
822
- focused: EventEmitter<void>;
823
- suffixClick: EventEmitter<void>;
893
+ readonly class: _angular_core.InputSignal<any>;
894
+ readonly maxlength: _angular_core.InputSignal<number | undefined>;
895
+ readonly validateFn: _angular_core.InputSignal<((value: string) => ValidationErrors | null) | undefined>;
896
+ readonly blurred: _angular_core.OutputEmitterRef<void>;
897
+ readonly focused: _angular_core.OutputEmitterRef<void>;
898
+ readonly suffixClick: _angular_core.OutputEmitterRef<void>;
824
899
  /** Accessible name for the suffix icon button (it renders no text). */
825
- suffixAriaLabel: string;
900
+ readonly suffixAriaLabel: _angular_core.InputSignal<string>;
826
901
  readonly fieldId: string;
827
902
  showPassword: boolean;
828
903
  validateError: ValidationErrors | null;
@@ -835,30 +910,30 @@ declare class InputComponent extends FxComponent<string> implements AfterViewIni
835
910
  togglePassword(): void;
836
911
  onSuffixClick(): void;
837
912
  get displayType(): string;
838
- static ɵfac: i0.ɵɵFactoryDeclaration<InputComponent, 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>;
913
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<InputComponent, never>;
914
+ static ɵcmp: _angular_core.ɵɵ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; "isSignal": true; }; "errorMessages": { "alias": "errorMessages"; "required": false; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "suffixIcon": { "alias": "suffixIcon"; "required": false; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; "maxlength": { "alias": "maxlength"; "required": false; "isSignal": true; }; "validateFn": { "alias": "validateFn"; "required": false; "isSignal": true; }; "suffixAriaLabel": { "alias": "suffixAriaLabel"; "required": false; "isSignal": true; }; }, { "blurred": "blurred"; "focused": "focused"; "suffixClick": "suffixClick"; }, never, never, true, never>;
840
915
  }
841
916
 
842
917
  declare class SelectComponent extends FxComponent<string | string[]> implements AfterViewInit, OnInit, OnChanges {
843
918
  private ref;
844
919
  label: string;
845
920
  tooltip: string;
846
- placeholder: string;
847
- options: {
921
+ readonly placeholder: _angular_core.InputSignal<string>;
922
+ readonly options: _angular_core.InputSignal<{
848
923
  label: string;
849
924
  value: string;
850
- }[];
851
- multiple: boolean;
925
+ }[]>;
926
+ readonly multiple: _angular_core.InputSignal<boolean>;
852
927
  errorMessages: Record<string, string>;
853
- required: boolean;
854
- class?: any;
855
- enableSearch: boolean;
856
- searchFn?: (query: string) => Promise<{
928
+ readonly required: _angular_core.InputSignal<boolean>;
929
+ readonly class: _angular_core.InputSignal<any>;
930
+ readonly enableSearch: _angular_core.InputSignal<boolean>;
931
+ readonly searchFn: _angular_core.InputSignal<((query: string) => Promise<{
857
932
  label: string;
858
933
  value: string;
859
- }[]>;
934
+ }[]>) | undefined>;
860
935
  /** Emits the current value when the select panel closes (useful for multiple mode). */
861
- closed: EventEmitter<string | string[]>;
936
+ readonly closed: _angular_core.OutputEmitterRef<string | string[]>;
862
937
  readonly fieldId: string;
863
938
  searchTerm: string;
864
939
  filteredOptions: {
@@ -877,8 +952,8 @@ declare class SelectComponent extends FxComponent<string | string[]> implements
877
952
  performSearch(term: string): Promise<void>;
878
953
  onSelectionChange(value: any): void;
879
954
  isSelected(value: string): boolean;
880
- static ɵfac: i0.ɵɵFactoryDeclaration<SelectComponent, 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>;
955
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SelectComponent, never>;
956
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SelectComponent, "fx-ui-select", never, { "label": { "alias": "label"; "required": false; }; "tooltip": { "alias": "tooltip"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "errorMessages": { "alias": "errorMessages"; "required": false; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; "enableSearch": { "alias": "enableSearch"; "required": false; "isSignal": true; }; "searchFn": { "alias": "searchFn"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, never, never, true, never>;
882
957
  }
883
958
 
884
959
  interface IRadioButton {
@@ -892,34 +967,34 @@ declare class RadioButtonComponent extends FxComponent<IRadioButton> implements
892
967
  readonly groupId: string;
893
968
  label?: string;
894
969
  tooltip: string;
895
- required?: boolean;
896
- options: {
970
+ readonly required: _angular_core.InputSignal<boolean | undefined>;
971
+ readonly options: _angular_core.InputSignal<{
897
972
  label: string;
898
973
  value: any;
899
974
  icon?: any;
900
975
  tooltip?: string;
901
- }[];
976
+ }[]>;
902
977
  errorMessages: ErrorMessages;
903
- class?: any;
978
+ readonly class: _angular_core.InputSignal<any>;
904
979
  constructor(ref: ChangeDetectorRef);
905
980
  ngAfterViewInit(): void;
906
981
  onSelectValue(value: any): void;
907
- static ɵfac: i0.ɵɵFactoryDeclaration<RadioButtonComponent, 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>;
982
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RadioButtonComponent, never>;
983
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RadioButtonComponent, "fx-ui-radio", never, { "label": { "alias": "label"; "required": false; }; "tooltip": { "alias": "tooltip"; "required": false; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "errorMessages": { "alias": "errorMessages"; "required": false; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
909
984
  }
910
985
 
911
986
  declare class CheckboxComponent extends FxComponent<any> implements AfterViewInit {
912
987
  private ref;
913
988
  label: string;
914
- rounded: boolean;
915
- valueChange: EventEmitter<boolean>;
989
+ readonly rounded: _angular_core.InputSignal<boolean | undefined>;
990
+ readonly valueChange: _angular_core.OutputEmitterRef<boolean>;
916
991
  constructor(ref: ChangeDetectorRef);
917
992
  ngAfterViewInit(): void;
918
993
  writeValue(value: any): void;
919
994
  onInputChange(event: Event): void;
920
995
  markTouched(): void;
921
- static ɵfac: i0.ɵɵFactoryDeclaration<CheckboxComponent, 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>;
996
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CheckboxComponent, never>;
997
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CheckboxComponent, "fx-ui-checkbox", never, { "label": { "alias": "label"; "required": false; }; "rounded": { "alias": "rounded"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
923
998
  }
924
999
 
925
1000
  interface UploadResult {
@@ -931,18 +1006,19 @@ interface UploadResult {
931
1006
  }[];
932
1007
  }
933
1008
  declare class DndUploadComponent {
934
- multiple: boolean;
1009
+ private cdr;
1010
+ readonly multiple: _angular_core.InputSignal<boolean>;
935
1011
  accept: string;
936
- maxSizeMB: number;
937
- strictSize: boolean;
1012
+ readonly maxSizeMB: _angular_core.InputSignal<number>;
1013
+ readonly strictSize: _angular_core.InputSignal<boolean>;
938
1014
  /** Icon name from heroicons (outline). Default: 'arrow-up-tray' */
939
- icon: string;
1015
+ readonly icon: _angular_core.InputSignal<string>;
940
1016
  /** CSS color value for accent (border, icon, link). Default uses --gradient-primary-start */
941
- accentColor: string;
942
- fileDrop: EventEmitter<File[]>;
943
- fileClick: EventEmitter<void>;
944
- uploadComplete: EventEmitter<File[]>;
945
- uploadError: EventEmitter<{
1017
+ readonly accentColor: _angular_core.InputSignal<string>;
1018
+ readonly fileDrop: _angular_core.OutputEmitterRef<File[]>;
1019
+ readonly fileClick: _angular_core.OutputEmitterRef<void>;
1020
+ readonly uploadComplete: _angular_core.OutputEmitterRef<File[]>;
1021
+ readonly uploadError: _angular_core.OutputEmitterRef<{
946
1022
  file: File;
947
1023
  reason: string;
948
1024
  }>;
@@ -957,103 +1033,137 @@ declare class DndUploadComponent {
957
1033
  private processFiles;
958
1034
  private onUpload;
959
1035
  private isAccepted;
960
- static ɵfac: i0.ɵɵFactoryDeclaration<DndUploadComponent, never>;
961
- static ɵcmp: i0.ɵɵComponentDeclaration<DndUploadComponent, "fx-ui-dnd-upload", never, { "multiple": { "alias": "multiple"; "required": false; }; "accept": { "alias": "accept"; "required": false; }; "maxSizeMB": { "alias": "maxSizeMB"; "required": false; }; "strictSize": { "alias": "strictSize"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "accentColor": { "alias": "accentColor"; "required": false; }; }, { "fileDrop": "fileDrop"; "fileClick": "fileClick"; "uploadComplete": "uploadComplete"; "uploadError": "uploadError"; }, never, never, false, never>;
1036
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DndUploadComponent, never>;
1037
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DndUploadComponent, "fx-ui-dnd-upload", never, { "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "accept": { "alias": "accept"; "required": false; }; "maxSizeMB": { "alias": "maxSizeMB"; "required": false; "isSignal": true; }; "strictSize": { "alias": "strictSize"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "accentColor": { "alias": "accentColor"; "required": false; "isSignal": true; }; }, { "fileDrop": "fileDrop"; "fileClick": "fileClick"; "uploadComplete": "uploadComplete"; "uploadError": "uploadError"; }, never, never, true, never>;
962
1038
  }
963
1039
 
964
1040
  declare class ButtonComponent {
965
1041
  label: string;
966
- disabled: boolean;
967
- buttonVariant: 'default' | 'primary' | 'success' | 'alternative';
1042
+ readonly disabled: _angular_core.InputSignal<boolean>;
1043
+ readonly buttonVariant: _angular_core.InputSignal<"default" | "success" | "primary" | "alternative">;
968
1044
  icon?: any;
969
- class?: any;
970
- loading: boolean;
1045
+ readonly class: _angular_core.InputSignal<any>;
1046
+ readonly loading: _angular_core.InputSignal<boolean>;
971
1047
  /** Native button type. Defaults to 'button' so it never implicitly submits a form. */
972
- type: 'button' | 'submit' | 'reset';
1048
+ readonly type: _angular_core.InputSignal<"button" | "submit" | "reset">;
973
1049
  /** Accessible name for icon-only usage (icon set, no label). */
974
- ariaLabel: string;
975
- clicked: EventEmitter<void>;
1050
+ readonly ariaLabel: _angular_core.InputSignal<string>;
1051
+ readonly clicked: _angular_core.OutputEmitterRef<void>;
976
1052
  onClick(): void;
977
- static ɵfac: i0.ɵɵFactoryDeclaration<ButtonComponent, 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>;
1053
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ButtonComponent, never>;
1054
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ButtonComponent, "fx-ui-button", never, { "label": { "alias": "label"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "buttonVariant": { "alias": "buttonVariant"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "clicked": "clicked"; }, never, never, true, never>;
979
1055
  }
980
1056
 
981
1057
  declare class RadioButtonToggleComponent extends FxComponent<any> implements AfterViewInit {
982
1058
  private ref;
983
1059
  readonly groupId: string;
984
1060
  label?: string;
985
- required?: boolean;
986
- options: {
1061
+ readonly required: _angular_core.InputSignal<boolean | undefined>;
1062
+ readonly options: _angular_core.InputSignal<{
987
1063
  label: string;
988
1064
  value: any;
989
1065
  icon?: any;
990
- }[];
1066
+ }[]>;
991
1067
  errorMessages: ErrorMessages;
992
- class?: any;
1068
+ readonly class: _angular_core.InputSignal<any>;
993
1069
  constructor(ref: ChangeDetectorRef);
994
1070
  ngAfterViewInit(): void;
995
1071
  onSelectValue(value: any): void;
996
- static ɵfac: i0.ɵɵFactoryDeclaration<RadioButtonToggleComponent, 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>;
1072
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RadioButtonToggleComponent, never>;
1073
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RadioButtonToggleComponent, "fx-ui-radio-toggle, [fx-ui-radio-toggle]", never, { "label": { "alias": "label"; "required": false; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "errorMessages": { "alias": "errorMessages"; "required": false; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
998
1074
  }
999
1075
 
1076
+ /**
1077
+ * Date/time field backed by first-party Material pickers (mat-datepicker +
1078
+ * mat-timepicker, the latter first-party since Material 19) — replaces the
1079
+ * former @danielmoncada/angular-datetime-picker + moment adapter stack.
1080
+ *
1081
+ * The public contract is unchanged: the CVA value is a plain string
1082
+ * ('YYYY-MM-DD HH:mm' for type 'both', 'YYYY-MM-DD' for 'calendar',
1083
+ * 'HH:mm' for 'timer'), so existing forms keep working as-is.
1084
+ */
1000
1085
  declare class DatetimePicker extends FxComponent<any> implements AfterViewInit {
1001
1086
  private ref;
1002
1087
  label?: string;
1003
- placeholder: string;
1004
- required: boolean;
1005
- type: any;
1006
- minDate?: any;
1007
- maxDate?: any;
1088
+ readonly placeholder: _angular_core.InputSignal<string>;
1089
+ readonly required: _angular_core.InputSignal<boolean>;
1090
+ /** 'both' | 'calendar' | 'timer' — same values the Owl picker accepted. */
1091
+ readonly type: _angular_core.InputSignal<"both" | "calendar" | "timer">;
1092
+ readonly minDate: _angular_core.InputSignal<any>;
1093
+ readonly maxDate: _angular_core.InputSignal<any>;
1008
1094
  errorMessages: ErrorMessages;
1009
- validateFn: (date: string) => ValidationErrors | null;
1095
+ readonly validateFn: _angular_core.InputSignal<((date: string) => ValidationErrors | null) | undefined>;
1010
1096
  readonly fieldId: string;
1011
- startAt: any;
1097
+ /** Internal Date the Material pickers operate on; `value` stays a string. */
1098
+ dateValue: Date | null;
1012
1099
  constructor(ref: ChangeDetectorRef);
1013
1100
  ngAfterViewInit(): void;
1101
+ get showDate(): boolean;
1102
+ get showTime(): boolean;
1103
+ get min(): Date | null;
1104
+ get max(): Date | null;
1014
1105
  onBlur(): void;
1015
1106
  writeValue(value: any): void;
1016
- onValueChange(date: any): void;
1017
- static ɵfac: i0.ɵɵFactoryDeclaration<DatetimePicker, 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>;
1107
+ onDateChange(date: Date | null): void;
1108
+ onTimeChange(time: Date | null): void;
1109
+ private commit;
1110
+ private toDate;
1111
+ private format;
1112
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DatetimePicker, never>;
1113
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DatetimePicker, "fx-ui-datetime-picker", never, { "label": { "alias": "label"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "errorMessages": { "alias": "errorMessages"; "required": false; }; "validateFn": { "alias": "validateFn"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1019
1114
  }
1020
1115
 
1021
1116
  declare class LoadingPanel {
1022
- show: boolean;
1117
+ readonly show: _angular_core.InputSignal<boolean>;
1023
1118
  message?: string;
1024
- static ɵfac: i0.ɵɵFactoryDeclaration<LoadingPanel, never>;
1025
- static ɵcmp: i0.ɵɵComponentDeclaration<LoadingPanel, "fx-ui-loading-panel", never, { "show": { "alias": "show"; "required": false; }; "message": { "alias": "message"; "required": false; }; }, {}, never, never, false, never>;
1119
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LoadingPanel, never>;
1120
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LoadingPanel, "fx-ui-loading-panel", never, { "show": { "alias": "show"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": false; }; }, {}, never, never, true, never>;
1026
1121
  }
1027
1122
 
1028
1123
  declare class SearchBarComponent extends FxComponent<string> implements AfterViewInit {
1029
1124
  private ref;
1030
- placeholder: string;
1031
- search: EventEmitter<string>;
1032
- valueChange: EventEmitter<string>;
1125
+ /** FxComponent leaves `value` undefined; without ngModel the input would
1126
+ render the literal string "undefined". */
1127
+ value: string;
1128
+ readonly placeholder: _angular_core.InputSignal<string>;
1129
+ readonly search: _angular_core.OutputEmitterRef<string>;
1130
+ readonly valueChange: _angular_core.OutputEmitterRef<string>;
1033
1131
  constructor(ref: ChangeDetectorRef);
1034
1132
  ngAfterViewInit(): void;
1035
1133
  writeValue(value: string): void;
1036
1134
  onValueChange(value: string): void;
1037
1135
  onEnterKey(): void;
1038
1136
  clear(): void;
1039
- static ɵfac: i0.ɵɵFactoryDeclaration<SearchBarComponent, 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>;
1137
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SearchBarComponent, never>;
1138
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SearchBarComponent, "fx-ui-search-bar", never, { "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; }, { "search": "search"; "valueChange": "valueChange"; }, never, never, true, never>;
1041
1139
  }
1042
1140
 
1043
1141
  declare class TabComponent {
1044
- label: string;
1142
+ readonly label: _angular_core.InputSignal<string>;
1045
1143
  icon?: string;
1046
- content: TemplateRef<any>;
1047
- static ɵfac: i0.ɵɵFactoryDeclaration<TabComponent, never>;
1048
- static ɵcmp: i0.ɵɵComponentDeclaration<TabComponent, "fx-ui-tab", never, { "label": { "alias": "label"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; }, {}, never, ["*"], false, never>;
1144
+ /** Trailing count badge (V2 'page' variant); null/undefined hides it. */
1145
+ readonly count: _angular_core.InputSignal<number | null>;
1146
+ /** Tints the count badge (e.g. vulnerabilities tab shows a danger count). */
1147
+ readonly tone: _angular_core.InputSignal<Tone | null>;
1148
+ readonly content: _angular_core.Signal<TemplateRef<any>>;
1149
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TabComponent, never>;
1150
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TabComponent, "fx-ui-tab", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; }; "count": { "alias": "count"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1049
1151
  }
1050
1152
 
1051
- declare class TabGroupComponent implements AfterContentInit {
1153
+ declare class TabGroupComponent implements AfterContentInit, AfterViewChecked, OnChanges {
1052
1154
  private renderer;
1053
- tabs: QueryList<TabComponent>;
1155
+ private cdr;
1156
+ readonly tabs: _angular_core.Signal<readonly TabComponent[]>;
1054
1157
  activeIndex: number;
1055
- tabListRef: ElementRef<HTMLElement>;
1056
- underlineRef: ElementRef<HTMLElement>;
1158
+ /** Emitted on user selection — enables [(activeIndex)] two-way binding. */
1159
+ readonly activeIndexChange: _angular_core.OutputEmitterRef<number>;
1160
+ /** 'page' = the V2 workspace tab strip (larger hit area, count badges). */
1161
+ readonly variant: _angular_core.InputSignal<"default" | "page">;
1162
+ readonly tabListRef: _angular_core.Signal<ElementRef<HTMLElement>>;
1163
+ readonly underlineRef: _angular_core.Signal<ElementRef<HTMLElement> | undefined>;
1164
+ readonly pagePillRef: _angular_core.Signal<ElementRef<HTMLElement> | undefined>;
1165
+ /** Last applied pill geometry — skip DOM writes when nothing moved. */
1166
+ private pillState;
1057
1167
  canScrollLeft: boolean;
1058
1168
  canScrollRight: boolean;
1059
1169
  private animateDelay;
@@ -1062,37 +1172,64 @@ declare class TabGroupComponent implements AfterContentInit {
1062
1172
  constructor(renderer: Renderer2);
1063
1173
  ngAfterContentInit(): void;
1064
1174
  selectTab(index: number): void;
1175
+ badgeClass(tab: TabComponent): string;
1065
1176
  /** Roving tablist keyboard nav: arrows move AND activate (selection follows focus). */
1066
1177
  onTabKeydown(event: KeyboardEvent, index: number): void;
1178
+ /** Parent-driven activeIndex (deep-link ?tab=, quick-links) must also move the pill. */
1179
+ ngOnChanges(changes: SimpleChanges): void;
1180
+ /**
1181
+ * Re-measure every view check: catches label-width changes (language switch,
1182
+ * count arriving) with cached geometry so the DOM write only happens when
1183
+ * the pill actually moved.
1184
+ */
1185
+ ngAfterViewChecked(): void;
1186
+ /** Slide the 'page' pill to the active tab (offset* is scroll-content relative). */
1187
+ private updatePagePill;
1067
1188
  private updateUnderlinePosition;
1068
1189
  private scrollToActiveTab;
1069
1190
  scroll(direction: 'left' | 'right'): void;
1070
1191
  onScroll(): void;
1071
1192
  private updateScrollButtons;
1072
1193
  onResize(): void;
1073
- static ɵfac: i0.ɵɵFactoryDeclaration<TabGroupComponent, never>;
1074
- static ɵcmp: i0.ɵɵComponentDeclaration<TabGroupComponent, "fx-ui-tab-group", never, { "activeIndex": { "alias": "activeIndex"; "required": false; }; }, {}, ["tabs"], never, false, never>;
1194
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TabGroupComponent, never>;
1195
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TabGroupComponent, "fx-ui-tab-group", never, { "activeIndex": { "alias": "activeIndex"; "required": false; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; }, { "activeIndexChange": "activeIndexChange"; }, ["tabs"], never, true, never>;
1075
1196
  }
1076
1197
 
1198
+ /**
1199
+ * Where the generated Heroicons sprite is served from. Defaults to
1200
+ * 'fx-icons.svg' at the app base — consumers copy it from the package via an
1201
+ * angular.json assets glob (same pattern as the lib fonts):
1202
+ * { "input": "node_modules/@foxeltech/angular-ui", "glob": "fx-icons.svg", "output": "." }
1203
+ */
1204
+ declare const FX_ICON_SPRITE_URL: InjectionToken<string>;
1205
+ /**
1206
+ * Heroicons rendered from the self-hosted sprite (see
1207
+ * scripts/generate-icon-sprite.mjs) — every 24px outline/solid icon is
1208
+ * available by name with no per-icon registration and no runtime icon
1209
+ * library. API kept compatible with the old @dimaslz/ng-heroicons wrapper.
1210
+ */
1077
1211
  declare class HeroIconComponent {
1078
- stroke: number;
1079
- icon: any;
1080
- solid: boolean;
1081
- outline: boolean;
1082
- size: number;
1083
- color: any;
1084
- class?: any;
1085
- static ɵfac: i0.ɵɵFactoryDeclaration<HeroIconComponent, never>;
1086
- static ɵcmp: i0.ɵɵComponentDeclaration<HeroIconComponent, "fx-ui-hero-icon", never, { "stroke": { "alias": "stroke"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "solid": { "alias": "solid"; "required": false; }; "outline": { "alias": "outline"; "required": false; }; "size": { "alias": "size"; "required": false; }; "color": { "alias": "color"; "required": false; }; "class": { "alias": "class"; "required": false; }; }, {}, never, never, false, never>;
1212
+ readonly stroke: _angular_core.InputSignal<number>;
1213
+ readonly icon: _angular_core.InputSignal<string | undefined>;
1214
+ readonly solid: _angular_core.InputSignal<boolean | undefined>;
1215
+ readonly outline: _angular_core.InputSignal<boolean | undefined>;
1216
+ readonly size: _angular_core.InputSignal<number | undefined>;
1217
+ readonly color: _angular_core.InputSignal<string | undefined>;
1218
+ readonly class: _angular_core.InputSignal<string | undefined>;
1219
+ readonly spriteUrl: string;
1220
+ constructor();
1221
+ get href(): string;
1222
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeroIconComponent, never>;
1223
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeroIconComponent, "fx-ui-hero-icon", never, { "stroke": { "alias": "stroke"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "solid": { "alias": "solid"; "required": false; "isSignal": true; }; "outline": { "alias": "outline"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1087
1224
  }
1088
1225
 
1089
1226
  declare class ToastComponent {
1090
- toastId: number;
1227
+ readonly toastId: _angular_core.InputSignal<number>;
1091
1228
  title?: string;
1092
- message: string;
1093
- type: 'success' | 'error' | 'info' | 'warning';
1094
- static ɵfac: i0.ɵɵFactoryDeclaration<ToastComponent, never>;
1095
- static ɵcmp: i0.ɵɵComponentDeclaration<ToastComponent, "fx-ui-toast", never, { "toastId": { "alias": "toastId"; "required": false; }; "title": { "alias": "title"; "required": false; }; "message": { "alias": "message"; "required": false; }; "type": { "alias": "type"; "required": false; }; }, {}, never, never, false, never>;
1229
+ readonly message: _angular_core.InputSignal<string>;
1230
+ readonly type: _angular_core.InputSignal<"error" | "success" | "info" | "warning" | undefined>;
1231
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ToastComponent, never>;
1232
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ToastComponent, "fx-ui-toast", never, { "toastId": { "alias": "toastId"; "required": true; "isSignal": true; }; "title": { "alias": "title"; "required": false; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1096
1233
  }
1097
1234
 
1098
1235
  declare class ToastContainerComponent {
@@ -1101,79 +1238,32 @@ declare class ToastContainerComponent {
1101
1238
  constructor(ref: ChangeDetectorRef);
1102
1239
  addToast(toast: any): void;
1103
1240
  removeToast(id: number): void;
1104
- static ɵfac: i0.ɵɵFactoryDeclaration<ToastContainerComponent, never>;
1105
- static ɵcmp: i0.ɵɵComponentDeclaration<ToastContainerComponent, "fx-ui-toast-container", never, {}, {}, never, never, false, never>;
1241
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ToastContainerComponent, never>;
1242
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ToastContainerComponent, "fx-ui-toast-container", never, {}, {}, never, never, true, never>;
1106
1243
  }
1107
1244
 
1108
1245
  type TagType = 'success' | 'warning' | 'critical' | 'information' | 'discovery' | 'default' | 'danger';
1109
1246
  declare class TagComponent {
1110
- label: string;
1111
- type: TagType;
1112
- rounded: boolean;
1113
- icon?: any;
1114
- solid: boolean;
1247
+ readonly label: _angular_core.InputSignal<string | undefined>;
1248
+ readonly type: _angular_core.InputSignal<TagType>;
1249
+ readonly rounded: _angular_core.InputSignal<boolean>;
1250
+ icon?: string;
1251
+ readonly solid: _angular_core.InputSignal<boolean>;
1115
1252
  clicked: EventEmitter<void>;
1116
1253
  onClick(): void;
1117
- static ɵfac: i0.ɵɵFactoryDeclaration<TagComponent, 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>;
1119
- }
1120
-
1121
- type IChartType = 'bar' | 'pie' | 'sunburst' | 'auto';
1122
- declare class ChartComponent implements OnChanges, AfterViewInit, OnDestroy {
1123
- private ref;
1124
- private cdr;
1125
- type: IChartType;
1126
- data: any;
1127
- options?: EChartsOption;
1128
- palette?: string[];
1129
- height: string;
1130
- loading: boolean;
1131
- pieLegendAlign: string | number;
1132
- pieLegendPosition: string | number;
1133
- showPieLabel: boolean;
1134
- mobileWidth: number;
1135
- labelFontFamily: string;
1136
- emptyText: string;
1137
- chartClick: EventEmitter<any>;
1138
- chartInit: EventEmitter<ECharts>;
1139
- chartOptions: EChartsOption;
1140
- isEmpty: boolean;
1141
- labelFontSize: number;
1142
- private chartInstance?;
1143
- private resizeObserver?;
1144
- private intersectionObserver?;
1145
- private canInit;
1146
- private isMobile;
1147
- private containerWidth;
1148
- constructor(ref: ElementRef<HTMLElement>, cdr: ChangeDetectorRef);
1149
- ngAfterViewInit(): void;
1150
- ngOnChanges(): void;
1151
- ngOnDestroy(): void;
1152
- onThemeChange(): void;
1153
- onChartClick(event: any): void;
1154
- onChartInit(chart: any): void;
1155
- private updateResponsiveState;
1156
- private forceMediaRecalc;
1157
- private rebuildChart;
1158
- private checkEmpty;
1159
- private registry;
1160
- private calcPieLayout;
1161
- private detectType;
1162
- private buildOptions;
1163
- private resolvePalette;
1164
- static ɵfac: i0.ɵɵFactoryDeclaration<ChartComponent, never>;
1165
- static ɵcmp: i0.ɵɵComponentDeclaration<ChartComponent, "fx-ui-chart", never, { "type": { "alias": "type"; "required": false; }; "data": { "alias": "data"; "required": false; }; "options": { "alias": "options"; "required": false; }; "palette": { "alias": "palette"; "required": false; }; "height": { "alias": "height"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "pieLegendAlign": { "alias": "pieLegendAlign"; "required": false; }; "pieLegendPosition": { "alias": "pieLegendPosition"; "required": false; }; "showPieLabel": { "alias": "showPieLabel"; "required": false; }; "mobileWidth": { "alias": "mobileWidth"; "required": false; }; "labelFontFamily": { "alias": "labelFontFamily"; "required": false; }; "emptyText": { "alias": "emptyText"; "required": false; }; }, { "chartClick": "chartClick"; "chartInit": "chartInit"; }, never, never, false, never>;
1254
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TagComponent, never>;
1255
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TagComponent, "fx-ui-tag", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "rounded": { "alias": "rounded"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; }; "solid": { "alias": "solid"; "required": false; "isSignal": true; }; }, { "clicked": "clicked"; }, never, never, true, never>;
1166
1256
  }
1167
1257
 
1168
1258
  declare class SliderComponent extends FxComponent<any> implements AfterViewInit {
1169
1259
  private ref;
1170
- trackRef: ElementRef<HTMLElement>;
1171
- thumbRef: ElementRef<HTMLElement>;
1172
- min: number;
1173
- max: number;
1174
- step: number;
1175
- vertical: boolean;
1176
- valueChange: EventEmitter<number>;
1260
+ readonly trackRef: _angular_core.Signal<ElementRef<HTMLElement>>;
1261
+ readonly thumbRef: _angular_core.Signal<ElementRef<HTMLElement>>;
1262
+ readonly min: _angular_core.InputSignal<number>;
1263
+ readonly max: _angular_core.InputSignal<number>;
1264
+ readonly step: _angular_core.InputSignal<number>;
1265
+ readonly vertical: _angular_core.InputSignal<boolean>;
1266
+ readonly valueChange: _angular_core.OutputEmitterRef<number>;
1177
1267
  dragging: boolean;
1178
1268
  constructor(ref: ChangeDetectorRef);
1179
1269
  ngAfterViewInit(): void;
@@ -1200,68 +1290,39 @@ declare class SliderComponent extends FxComponent<any> implements AfterViewInit
1200
1290
  transform: string;
1201
1291
  bottom?: undefined;
1202
1292
  };
1203
- static ɵfac: i0.ɵɵFactoryDeclaration<SliderComponent, 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>;
1293
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SliderComponent, never>;
1294
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SliderComponent, "fx-ui-slider", never, { "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "vertical": { "alias": "vertical"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
1205
1295
  }
1206
1296
 
1207
1297
  declare class SwitchComponent extends FxComponent<any> implements AfterViewInit {
1208
- private cdr;
1209
- onSwitch: EventEmitter<boolean>;
1298
+ readonly onSwitch: _angular_core.OutputEmitterRef<boolean>;
1210
1299
  /** Accessible name — the switch renders no visible text of its own. */
1211
- ariaLabel: string;
1300
+ readonly ariaLabel: _angular_core.InputSignal<string>;
1212
1301
  ngAfterViewInit(): void;
1213
- constructor(cdr: ChangeDetectorRef);
1214
1302
  writeValue(value: any): void;
1215
1303
  toggle(): void;
1216
- static ɵfac: i0.ɵɵFactoryDeclaration<SwitchComponent, never>;
1217
- static ɵcmp: i0.ɵɵComponentDeclaration<SwitchComponent, "fx-ui-switch", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; }; }, { "onSwitch": "onSwitch"; }, never, never, false, never>;
1218
- }
1219
-
1220
- declare class RichTextAreaComponent extends FxComponent<any> implements AfterViewInit {
1221
- private cdr;
1222
- private styleLoader;
1223
- private platformId;
1224
- editorContainer: ElementRef<HTMLDivElement>;
1225
- placeholder: string;
1226
- toolbarOptions: any;
1227
- contentChange: EventEmitter<string>;
1228
- private quillInstance;
1229
- constructor(cdr: ChangeDetectorRef, styleLoader: QuillStyleLoaderService, platformId: object);
1230
- ngAfterViewInit(): Promise<void>;
1231
- writeValue(value: any): void;
1232
- setDisabledState(isDisabled: boolean): void;
1233
- static ɵfac: i0.ɵɵFactoryDeclaration<RichTextAreaComponent, never>;
1234
- static ɵcmp: i0.ɵɵComponentDeclaration<RichTextAreaComponent, "fx-ui-rich-text-area", never, { "placeholder": { "alias": "placeholder"; "required": false; }; "toolbarOptions": { "alias": "toolbarOptions"; "required": false; }; }, { "contentChange": "contentChange"; }, never, never, false, never>;
1304
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SwitchComponent, never>;
1305
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SwitchComponent, "fx-ui-switch", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "onSwitch": "onSwitch"; }, never, never, true, never>;
1235
1306
  }
1236
1307
 
1237
1308
  declare class SkeletonTableLoadingComponent {
1238
- columns: number;
1239
- rows: number;
1240
- static ɵfac: i0.ɵɵFactoryDeclaration<SkeletonTableLoadingComponent, never>;
1241
- static ɵcmp: i0.ɵɵComponentDeclaration<SkeletonTableLoadingComponent, "fx-ui-skeleton-table-loading", never, { "columns": { "alias": "columns"; "required": false; }; "rows": { "alias": "rows"; "required": false; }; }, {}, never, never, false, never>;
1242
- }
1243
-
1244
- declare class FlowConnection {
1245
- nodes: Node[];
1246
- edges: Edge[];
1247
- backgroundColor: any;
1248
- view: any;
1249
- handleConnection(connection: Connection): void;
1250
- static ɵfac: i0.ɵɵFactoryDeclaration<FlowConnection, never>;
1251
- static ɵcmp: i0.ɵɵComponentDeclaration<FlowConnection, "fx-ui-flow-connection", never, { "nodes": { "alias": "nodes"; "required": false; }; "edges": { "alias": "edges"; "required": false; }; "backgroundColor": { "alias": "backgroundColor"; "required": false; }; "view": { "alias": "view"; "required": false; }; }, {}, never, never, false, never>;
1309
+ readonly columns: _angular_core.InputSignal<number>;
1310
+ readonly rows: _angular_core.InputSignal<number>;
1311
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkeletonTableLoadingComponent, never>;
1312
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SkeletonTableLoadingComponent, "fx-ui-skeleton-table-loading", never, { "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1252
1313
  }
1253
1314
 
1254
1315
  declare class CircleProgressBar {
1255
- percent: number;
1256
- showPercent: boolean;
1316
+ readonly percent: _angular_core.InputSignal<number>;
1317
+ readonly showPercent: _angular_core.InputSignal<boolean>;
1257
1318
  readonly radius = 35;
1258
1319
  readonly stroke = 10;
1259
1320
  readonly normalizedRadius: number;
1260
1321
  readonly circumference: number;
1261
1322
  get dashOffset(): number;
1262
1323
  get ariaLabel(): string;
1263
- static ɵfac: i0.ɵɵFactoryDeclaration<CircleProgressBar, never>;
1264
- static ɵcmp: i0.ɵɵComponentDeclaration<CircleProgressBar, "fx-ui-circle-progress-bar", never, { "percent": { "alias": "percent"; "required": false; }; "showPercent": { "alias": "showPercent"; "required": false; }; }, {}, never, never, false, never>;
1324
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CircleProgressBar, never>;
1325
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CircleProgressBar, "fx-ui-circle-progress-bar", never, { "percent": { "alias": "percent"; "required": false; "isSignal": true; }; "showPercent": { "alias": "showPercent"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1265
1326
  }
1266
1327
 
1267
1328
  interface TreeNode {
@@ -1273,9 +1334,9 @@ interface TreeNode {
1273
1334
  declare class TreeDiagram implements AfterViewInit, OnDestroy {
1274
1335
  private zone;
1275
1336
  private cdr;
1276
- data: any;
1277
- container: ElementRef;
1278
- root: ElementRef;
1337
+ readonly data: _angular_core.InputSignal<any>;
1338
+ readonly container: _angular_core.Signal<ElementRef<any>>;
1339
+ readonly root: _angular_core.Signal<ElementRef<any>>;
1279
1340
  children: QueryList<ElementRef>;
1280
1341
  lines: any[];
1281
1342
  svgWidth: number;
@@ -1287,15 +1348,15 @@ declare class TreeDiagram implements AfterViewInit, OnDestroy {
1287
1348
  ngOnDestroy(): void;
1288
1349
  private scheduleDraw;
1289
1350
  private drawLines;
1290
- static ɵfac: i0.ɵɵFactoryDeclaration<TreeDiagram, never>;
1291
- static ɵcmp: i0.ɵɵComponentDeclaration<TreeDiagram, "fx-ui-tree-diagram", never, { "data": { "alias": "data"; "required": false; }; }, {}, never, never, false, never>;
1351
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TreeDiagram, never>;
1352
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TreeDiagram, "fx-ui-tree-diagram", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1292
1353
  }
1293
1354
 
1294
1355
  declare class TableCell {
1295
- loading: boolean;
1296
- skeletonClass: string;
1297
- static ɵfac: i0.ɵɵFactoryDeclaration<TableCell, never>;
1298
- static ɵcmp: i0.ɵɵComponentDeclaration<TableCell, "fx-ui-table-cell", never, { "loading": { "alias": "loading"; "required": true; }; "skeletonClass": { "alias": "skeletonClass"; "required": false; }; }, {}, never, ["*"], false, never>;
1356
+ readonly loading: _angular_core.InputSignal<boolean>;
1357
+ readonly skeletonClass: _angular_core.InputSignal<string>;
1358
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TableCell, never>;
1359
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TableCell, "fx-ui-table-cell", never, { "loading": { "alias": "loading"; "required": true; "isSignal": true; }; "skeletonClass": { "alias": "skeletonClass"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1299
1360
  }
1300
1361
 
1301
1362
  interface KanbanColumn<T = any> {
@@ -1312,9 +1373,9 @@ interface ColumnChangedEvent<T = any> {
1312
1373
  }
1313
1374
 
1314
1375
  declare class KanbanBoardComponent<T = any> {
1315
- columns: KanbanColumn<T>[];
1376
+ readonly columns: _angular_core.InputSignal<KanbanColumn<T>[]>;
1316
1377
  itemTemplate?: TemplateRef<any>;
1317
- columnChanged: EventEmitter<ColumnChangedEvent<T>>;
1378
+ readonly columnChanged: _angular_core.OutputEmitterRef<ColumnChangedEvent<T>>;
1318
1379
  /**
1319
1380
  * Get all column IDs for connecting drop lists
1320
1381
  */
@@ -1323,14 +1384,16 @@ declare class KanbanBoardComponent<T = any> {
1323
1384
  * Handle drop event when item is moved
1324
1385
  */
1325
1386
  onDrop(event: CdkDragDrop<T[]>, columnId: string): void;
1326
- static ɵfac: i0.ɵɵFactoryDeclaration<KanbanBoardComponent<any>, never>;
1327
- static ɵcmp: i0.ɵɵComponentDeclaration<KanbanBoardComponent<any>, "fx-ui-kanban-board", never, { "columns": { "alias": "columns"; "required": false; }; "itemTemplate": { "alias": "itemTemplate"; "required": false; }; }, { "columnChanged": "columnChanged"; }, never, never, false, never>;
1387
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KanbanBoardComponent<any>, never>;
1388
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KanbanBoardComponent<any>, "fx-ui-kanban-board", never, { "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "itemTemplate": { "alias": "itemTemplate"; "required": false; }; }, { "columnChanged": "columnChanged"; }, never, never, true, never>;
1328
1389
  }
1329
1390
 
1330
1391
  interface DrawerItem {
1331
1392
  id: string;
1332
1393
  label: string;
1333
1394
  icon: string;
1395
+ /** V2: renders as a non-interactive section caption (flat nav, no accordion). */
1396
+ heading?: boolean;
1334
1397
  route?: string;
1335
1398
  children?: DrawerItem[];
1336
1399
  action?: () => void;
@@ -1338,12 +1401,20 @@ interface DrawerItem {
1338
1401
 
1339
1402
  declare class DrawerComponent implements OnInit, OnDestroy {
1340
1403
  private router;
1341
- items: DrawerItem[];
1404
+ private cdr;
1405
+ readonly items: _angular_core.InputSignal<DrawerItem[]>;
1406
+ /** V2: bottom-pinned section (Administration group) — same item rendering,
1407
+ separated by a rule, above the [drawerFooter] slot and version. */
1408
+ readonly footerItems: _angular_core.InputSignal<DrawerItem[]>;
1342
1409
  isExpanded: boolean;
1343
1410
  logo?: string;
1411
+ /** Wordmark cạnh logo, chỉ hiện khi drawer mở. Bỏ trống = chỉ có mark. */
1412
+ logoText?: string;
1413
+ /** Dòng phụ dưới logoText (tagline/workspace). Chỉ hiện khi drawer mở. */
1414
+ logoSubtext?: string;
1344
1415
  version?: string;
1345
- toggleExpanded: EventEmitter<boolean>;
1346
- itemClicked: EventEmitter<DrawerItem>;
1416
+ readonly toggleExpanded: _angular_core.OutputEmitterRef<boolean>;
1417
+ readonly itemClicked: _angular_core.OutputEmitterRef<DrawerItem>;
1347
1418
  expandedItems: Set<string>;
1348
1419
  currentRoute: string;
1349
1420
  private destroy$;
@@ -1359,60 +1430,83 @@ declare class DrawerComponent implements OnInit, OnDestroy {
1359
1430
  private autoExpandActiveParents;
1360
1431
  getAccordionState(itemId: string): string;
1361
1432
  getDrawerState(): string;
1362
- static ɵfac: i0.ɵɵFactoryDeclaration<DrawerComponent, never>;
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>;
1433
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DrawerComponent, never>;
1434
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DrawerComponent, "fx-ui-drawer", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "footerItems": { "alias": "footerItems"; "required": false; "isSignal": true; }; "isExpanded": { "alias": "isExpanded"; "required": false; }; "logo": { "alias": "logo"; "required": false; }; "logoText": { "alias": "logoText"; "required": false; }; "logoSubtext": { "alias": "logoSubtext"; "required": false; }; "version": { "alias": "version"; "required": false; }; }, { "toggleExpanded": "toggleExpanded"; "itemClicked": "itemClicked"; }, never, ["[drawerFooter]"], true, never>;
1364
1435
  }
1365
1436
 
1366
1437
  /** Row-card skeleton placeholder for master-detail list panes. */
1367
1438
  declare class SkeletonListComponent {
1368
- rows: number;
1439
+ readonly rows: _angular_core.InputSignal<number>;
1369
1440
  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>;
1441
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkeletonListComponent, never>;
1442
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SkeletonListComponent, "fx-ui-skeleton-list", never, { "rows": { "alias": "rows"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1372
1443
  }
1373
1444
 
1374
1445
  /** Card-shaped skeleton placeholder for detail panels. */
1375
1446
  declare class SkeletonDetailComponent {
1376
1447
  /** Number of content cards rendered below the header card. */
1377
- cards: number;
1448
+ readonly cards: _angular_core.InputSignal<number>;
1378
1449
  /** Rows per content card. */
1379
- rows: number;
1450
+ readonly rows: _angular_core.InputSignal<number>;
1380
1451
  range(n: number): number[];
1381
1452
  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>;
1453
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkeletonDetailComponent, never>;
1454
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SkeletonDetailComponent, "fx-ui-skeleton-detail", never, { "cards": { "alias": "cards"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1384
1455
  }
1385
1456
 
1457
+ interface FxStatCardDelta {
1458
+ /** Caller-formatted delta text (e.g. "+12%", "-3"). */
1459
+ value: string;
1460
+ direction: 'up' | 'down';
1461
+ /** Delta colour — up is not always good (findings up = danger). */
1462
+ tone?: Tone | null;
1463
+ }
1386
1464
  interface FxStatCard {
1387
1465
  /** Caller-translated caption. */
1388
1466
  label: string;
1389
1467
  value: string | number;
1390
1468
  /** hero-icon name shown in the tinted box. */
1391
- icon?: any;
1469
+ icon?: string;
1392
1470
  /** Colours the number and the icon box; null/undefined renders neutral. */
1393
1471
  tone?: Tone | null;
1472
+ /** V2 StatGrid: trend chip beside the number. */
1473
+ delta?: FxStatCardDelta;
1474
+ /** V2 StatGrid: mini bar-trend under the caption. */
1475
+ spark?: number[];
1476
+ /** variant 'figure': caller-formatted sub-caption under the number ("+1 since 4.8.0"). */
1477
+ sub?: string;
1478
+ /** Colours the sub-caption; null/undefined renders muted. */
1479
+ subTone?: Tone | null;
1394
1480
  }
1395
1481
  /** KPI tile row: big number + tinted icon box + caption, in a responsive grid. */
1396
1482
  declare class StatCardsComponent {
1397
- cards: FxStatCard[];
1483
+ readonly cards: _angular_core.InputSignal<FxStatCard[]>;
1484
+ /**
1485
+ * 'tile' (default): tinted icon box + number + caption — the pre-V2 look.
1486
+ * 'figure': the V2 design's KPI column — caption on top, large figure-font
1487
+ * number, toned sub-caption underneath (no icon box).
1488
+ */
1489
+ readonly variant: _angular_core.InputSignal<"figure" | "tile">;
1398
1490
  /** Grid columns; defaults to one column per card. */
1399
1491
  cols?: number;
1400
1492
  get gridColumns(): string;
1401
1493
  numClass(card: FxStatCard): string;
1402
1494
  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>;
1495
+ deltaClass(card: FxStatCard): string;
1496
+ subClass(card: FxStatCard): string;
1497
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StatCardsComponent, never>;
1498
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StatCardsComponent, "fx-ui-stat-cards", never, { "cards": { "alias": "cards"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "cols": { "alias": "cols"; "required": false; }; }, {}, never, never, true, never>;
1405
1499
  }
1406
1500
 
1407
1501
  /** Centered "no data" block. The message is caller-translated (no i18n in lib). */
1408
1502
  declare class EmptyStateComponent {
1409
- message: string;
1503
+ readonly message: _angular_core.InputSignal<string>;
1410
1504
  /** Optional icon (hero-icon name). */
1411
1505
  icon?: any;
1412
1506
  /** 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>;
1507
+ readonly height: _angular_core.InputSignal<string>;
1508
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EmptyStateComponent, never>;
1509
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EmptyStateComponent, "fx-ui-empty-state", never, { "message": { "alias": "message"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1416
1510
  }
1417
1511
 
1418
1512
  interface FxFilterChipOption {
@@ -1428,40 +1522,142 @@ interface FxFilterChipOption {
1428
1522
  */
1429
1523
  declare class FilterChipsComponent {
1430
1524
  options: FxFilterChipOption[];
1431
- value: string;
1432
- valueChange: EventEmitter<string>;
1525
+ value: string | undefined;
1526
+ readonly valueChange: _angular_core.OutputEmitterRef<string>;
1433
1527
  /** Per-value tone overrides (e.g. { Safe: 'information', Protected: 'discovery' as any }). */
1434
1528
  toneOverrides: Record<string, Tone | null>;
1435
1529
  select(option: FxFilterChipOption): void;
1436
1530
  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>;
1531
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FilterChipsComponent, never>;
1532
+ static ɵcmp: _angular_core.ɵɵ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, true, never>;
1533
+ }
1534
+
1535
+ interface FxFilterPillOption {
1536
+ /** '' (empty) is the conventional "All" pill. */
1537
+ value: string;
1538
+ /** Caller-translated label. */
1539
+ label: string;
1540
+ /** Shown muted beside the label; null/undefined renders no count. */
1541
+ count?: number | null;
1542
+ }
1543
+ /**
1544
+ * V2 filter pills — the quick-filter row above ranked lists (design refs 02,
1545
+ * 03, 11): outlined capsules with a muted count, the active one filled with
1546
+ * the primary text colour.
1547
+ *
1548
+ * Distinct from `fx-ui-filter-chips`, which tints each chip by its severity
1549
+ * tone and carries no count. Presentational: the caller owns the filter state.
1550
+ *
1551
+ * <fx-ui-filter-pills [options]="pills" [value]="filters.status"
1552
+ * (valueChange)="filters.status = $event; refresh()" />
1553
+ */
1554
+ declare class FilterPillsComponent {
1555
+ readonly options: _angular_core.InputSignal<FxFilterPillOption[]>;
1556
+ /** Accepts undefined so screens can bind an optional filter-bag key. */
1557
+ readonly value: _angular_core.InputSignal<string | undefined>;
1558
+ readonly valueChange: _angular_core.OutputEmitterRef<string>;
1559
+ isActive(option: FxFilterPillOption): boolean;
1560
+ pillClass(option: FxFilterPillOption): string;
1561
+ countClass(option: FxFilterPillOption): string;
1562
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FilterPillsComponent, never>;
1563
+ 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>;
1564
+ }
1565
+
1566
+ /**
1567
+ * V2 stage progress dots — the walkthrough position indicator on the attack
1568
+ * chain toolbar (design refs 04, 07): one dot per stage, the current one drawn
1569
+ * as a wider accent bar, visited ones solid, the rest faint.
1570
+ *
1571
+ * <fx-ui-stage-dots [count]="8" [current]="stageIndex()"
1572
+ * (dotClick)="goToStage($event)" />
1573
+ */
1574
+ declare class StageDotsComponent {
1575
+ readonly count: _angular_core.InputSignal<number>;
1576
+ /** 0-based current stage; -1 (default) means none selected yet. */
1577
+ readonly current: _angular_core.InputSignal<number>;
1578
+ /** Emit the clicked stage index; wire it to make the dots navigable. */
1579
+ readonly dotClick: _angular_core.OutputEmitterRef<number>;
1580
+ readonly dots: _angular_core.Signal<number[]>;
1581
+ dotClass(index: number): string;
1582
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StageDotsComponent, never>;
1583
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StageDotsComponent, "fx-ui-stage-dots", never, { "count": { "alias": "count"; "required": false; "isSignal": true; }; "current": { "alias": "current"; "required": false; "isSignal": true; }; }, { "dotClick": "dotClick"; }, never, never, true, never>;
1584
+ }
1585
+
1586
+ /**
1587
+ * V2 evidence code block — the mono panel that carries a process tree, a
1588
+ * command line or any captured text (design ref 05, "Process tree").
1589
+ *
1590
+ * Whitespace is preserved and the box scrolls on its own rather than pushing
1591
+ * the page wide, so ASCII trees survive narrow viewports.
1592
+ *
1593
+ * <fx-ui-code-block [label]="'analyze.processTree' | translate" [code]="tree" />
1594
+ */
1595
+ declare class CodeBlockComponent {
1596
+ readonly code: _angular_core.InputSignal<string>;
1597
+ /** Caller-translated caption above the box; omit for a bare block. */
1598
+ readonly label: _angular_core.InputSignal<string>;
1599
+ /** Scroll cap; empty grows with the content. */
1600
+ readonly maxHeight: _angular_core.InputSignal<string>;
1601
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CodeBlockComponent, never>;
1602
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CodeBlockComponent, "fx-ui-code-block", never, { "code": { "alias": "code"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1603
+ }
1604
+
1605
+ /**
1606
+ * V2 captured-evidence frame — a faux window chrome (traffic lights + mono file
1607
+ * name + timestamp) around a screenshot, with a placeholder when the image is
1608
+ * missing (design ref 05, "Screenshot").
1609
+ *
1610
+ * <fx-ui-screenshot-frame [label]="'analyze.screenshot' | translate"
1611
+ * fileName="chain-05.png" timestamp="09:42:18"
1612
+ * [src]="url" [caption]="caption" />
1613
+ */
1614
+ declare class ScreenshotFrameComponent {
1615
+ /** Caller-translated caption above the frame; omit for a bare frame. */
1616
+ readonly label: _angular_core.InputSignal<string>;
1617
+ readonly fileName: _angular_core.InputSignal<string>;
1618
+ readonly timestamp: _angular_core.InputSignal<string>;
1619
+ /** Image URL; empty renders the placeholder body. */
1620
+ readonly src: _angular_core.InputSignal<string>;
1621
+ /** Caller-translated line under (or inside) the frame. */
1622
+ readonly caption: _angular_core.InputSignal<string>;
1623
+ readonly alt: _angular_core.InputSignal<string>;
1624
+ readonly height: _angular_core.InputSignal<string>;
1625
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ScreenshotFrameComponent, never>;
1626
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ScreenshotFrameComponent, "fx-ui-screenshot-frame", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "fileName": { "alias": "fileName"; "required": false; "isSignal": true; }; "timestamp": { "alias": "timestamp"; "required": false; "isSignal": true; }; "src": { "alias": "src"; "required": false; "isSignal": true; }; "caption": { "alias": "caption"; "required": false; "isSignal": true; }; "alt": { "alias": "alt"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1439
1627
  }
1440
1628
 
1441
1629
  /** Thin tone-coloured progress/score bar with optional label and caption. */
1442
1630
  declare class MeterComponent {
1443
1631
  value: number;
1444
1632
  max: number;
1445
- tone: Tone | null;
1633
+ readonly tone: _angular_core.InputSignal<Tone | null>;
1446
1634
  /** Caller-translated texts; omitted → bar only. */
1447
1635
  label?: string;
1448
1636
  caption?: string;
1449
1637
  get percent(): number;
1450
1638
  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>;
1639
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MeterComponent, never>;
1640
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MeterComponent, "fx-ui-meter", never, { "value": { "alias": "value"; "required": false; }; "max": { "alias": "max"; "required": false; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; }; "caption": { "alias": "caption"; "required": false; }; }, {}, never, never, true, never>;
1453
1641
  }
1454
1642
 
1455
- /** Detail-panel section: card with an icon + heading header and projected body. */
1643
+ /**
1644
+ * Panel section: card with a header and projected body.
1645
+ * - titleStyle 'heading' (default): icon + heading, the pre-V2 look
1646
+ * - titleStyle 'eyebrow': the V2 design's panel header — small tracked
1647
+ * caption on the left, muted [aside] text on the right
1648
+ */
1456
1649
  declare class SectionCardComponent {
1457
1650
  /** Caller-translated heading. */
1458
- title: string;
1651
+ readonly title: _angular_core.InputSignal<string>;
1459
1652
  /** hero-icon name; omitted → text-only header. */
1460
1653
  icon?: any;
1461
- iconTone: Tone | null;
1654
+ readonly iconTone: _angular_core.InputSignal<Tone | null>;
1655
+ readonly titleStyle: _angular_core.InputSignal<"heading" | "eyebrow">;
1656
+ /** Caller-translated right-aligned hint (eyebrow style). */
1657
+ readonly aside: _angular_core.InputSignal<string>;
1462
1658
  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>;
1659
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SectionCardComponent, never>;
1660
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SectionCardComponent, "fx-ui-section-card", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; }; "iconTone": { "alias": "iconTone"; "required": false; "isSignal": true; }; "titleStyle": { "alias": "titleStyle"; "required": false; "isSignal": true; }; "aside": { "alias": "aside"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1465
1661
  }
1466
1662
 
1467
1663
  /**
@@ -1471,18 +1667,18 @@ declare class SectionCardComponent {
1471
1667
  */
1472
1668
  declare class InfoFieldComponent {
1473
1669
  /** Caller-translated label. */
1474
- label: string;
1670
+ readonly label: _angular_core.InputSignal<string>;
1475
1671
  value: string | number | null | undefined;
1476
1672
  /** Colours the value; null/undefined renders the primary text colour. */
1477
1673
  tone: Tone | null;
1478
1674
  /** Monospace value (hashes, paths). */
1479
1675
  mono: boolean;
1480
1676
  /** Placeholder when value is empty. */
1481
- placeholder: string;
1677
+ readonly placeholder: _angular_core.InputSignal<string>;
1482
1678
  get displayValue(): string;
1483
1679
  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>;
1680
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<InfoFieldComponent, never>;
1681
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<InfoFieldComponent, "fx-ui-info-field", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; }; "tone": { "alias": "tone"; "required": false; }; "mono": { "alias": "mono"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1486
1682
  }
1487
1683
 
1488
1684
  interface FxSeverityBadge {
@@ -1507,20 +1703,22 @@ declare class SeverityBadgesComponent {
1507
1703
  showZero: boolean;
1508
1704
  /** Append the severity letter to counts ("3C", "5H", "2M") per the report design. */
1509
1705
  suffixed: boolean;
1510
- badgeClick: EventEmitter<string>;
1706
+ readonly badgeClick: _angular_core.OutputEmitterRef<string>;
1511
1707
  private static readonly TONES;
1512
1708
  get badges(): FxSeverityBadge[];
1513
1709
  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>;
1710
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SeverityBadgesComponent, never>;
1711
+ static ɵcmp: _angular_core.ɵɵ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, true, never>;
1516
1712
  }
1517
1713
 
1518
1714
  /**
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:
1715
+ * Master-detail shell driven by a BaseMasterDetailComponent. Two-column by
1716
+ * default; projecting a [mdFacets] block (V2 lookup screens) adds a third
1717
+ * facets-rail column before the list. The host page projects its own
1718
+ * header/filters and supplies templates for the parts that vary per entity:
1522
1719
  *
1523
1720
  * <fx-ui-master-detail [table]="this" [emptyMessage]="'noData' | translate">
1721
+ * <div mdFacets>…<fx-ui-facets-rail …/>…</div> <!-- optional, V2 -->
1524
1722
  * <div mdHeader>…title / stat cards…</div>
1525
1723
  * <div mdFilters>…search bar / filter chips…</div>
1526
1724
  * <ng-template #row let-item let-selected="selected">…row body…</ng-template>
@@ -1530,26 +1728,449 @@ declare class SeverityBadgesComponent {
1530
1728
  * The list behaves as a single-select listbox: the selected option is the
1531
1729
  * tab stop, ArrowUp/Down/Home/End move the selection.
1532
1730
  */
1533
- declare class MasterDetailComponent implements AfterViewInit {
1731
+ declare class MasterDetailComponent implements AfterViewInit, AfterContentInit {
1732
+ private hostEl;
1733
+ /** True when the host projected a [mdFacets] block — switches to 3 columns. */
1734
+ hasFacets: boolean;
1534
1735
  table: BaseMasterDetailComponent<any>;
1535
1736
  /** Fixed list-pane width on lg+ viewports (stacked full-width below). */
1536
- listWidth: string;
1537
- maxListHeight: string;
1538
- pageSizeOptions: number[];
1737
+ readonly listWidth: _angular_core.InputSignal<string>;
1738
+ readonly maxListHeight: _angular_core.InputSignal<string>;
1739
+ readonly pageSizeOptions: _angular_core.InputSignal<number[]>;
1539
1740
  /** 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;
1741
+ readonly emptyMessage: _angular_core.InputSignal<string>;
1742
+ readonly listLabel: _angular_core.InputSignal<string>;
1743
+ readonly skeletonCards: _angular_core.InputSignal<number>;
1744
+ /** 'prevnext' renders the V2 "X of Y" + Prev/Next controls instead of the
1745
+ Material paginator (which stays in the DOM, hidden — it is the paging
1746
+ engine BaseTable subscribes to). */
1747
+ readonly paginationStyle: _angular_core.InputSignal<"paginator" | "prevnext">;
1748
+ /** Caller-translated Prev/Next labels ("X of Y" is numeric). */
1749
+ readonly prevLabel: _angular_core.InputSignal<string>;
1750
+ readonly nextLabel: _angular_core.InputSignal<string>;
1751
+ readonly rowTemplate: _angular_core.Signal<TemplateRef<any>>;
1752
+ readonly detailTemplate: _angular_core.Signal<TemplateRef<any>>;
1753
+ readonly paginator: _angular_core.Signal<MatPaginator>;
1546
1754
  readonly uid: string;
1755
+ ngAfterContentInit(): void;
1547
1756
  ngAfterViewInit(): void;
1757
+ /** "X of Y" range text for the prevnext pagination style. */
1758
+ rangeText(): string;
1548
1759
  isSelected(row: any): boolean;
1549
1760
  optionId(index: number): string;
1550
1761
  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>;
1762
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MasterDetailComponent, never>;
1763
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MasterDetailComponent, "fx-ui-master-detail", never, { "table": { "alias": "table"; "required": false; }; "listWidth": { "alias": "listWidth"; "required": false; "isSignal": true; }; "maxListHeight": { "alias": "maxListHeight"; "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>;
1764
+ }
1765
+
1766
+ interface FxMenuItem {
1767
+ /** Caller-translated label. */
1768
+ label: string;
1769
+ /** Optional hero-icon name shown before the label. */
1770
+ icon?: string;
1771
+ /** Danger/warning items get the matching text tone. */
1772
+ tone?: Tone | null;
1773
+ disabled?: boolean;
1774
+ /** Free-form identifier handed back on (select). */
1775
+ value?: any;
1776
+ }
1777
+ /**
1778
+ * Row-action dropdown wrapper over mat-menu (behavior-layer rule, Playbook
1779
+ * §5.1 — apps never import @angular/material directly). Project the trigger
1780
+ * content; items render from [items] and come back through (select).
1781
+ *
1782
+ * <fx-ui-menu [items]="actions" (select)="onAction($event)">
1783
+ * <fx-ui-hero-icon icon="ellipsis-vertical" [size]="20" />
1784
+ * </fx-ui-menu>
1785
+ */
1786
+ declare class MenuComponent {
1787
+ readonly items: _angular_core.InputSignal<FxMenuItem[]>;
1788
+ readonly disabled: _angular_core.InputSignal<boolean>;
1789
+ /** Accessible name for the trigger button. */
1790
+ readonly ariaLabel: _angular_core.InputSignal<string>;
1791
+ readonly select: _angular_core.OutputEmitterRef<FxMenuItem>;
1792
+ toneClass(item: FxMenuItem): string;
1793
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MenuComponent, never>;
1794
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MenuComponent, "fx-ui-menu", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "select": "select"; }, never, ["*"], true, never>;
1795
+ }
1796
+
1797
+ /**
1798
+ * V2 theme picker — dropdown các theme OgeniumDashboards cho chọn
1799
+ * (OG_PICKER_THEME_META: porcelain/charcoal), mỗi dòng có swatch accent +
1800
+ * page. Drives ThemeService.setTheme(); replaces the pre-V2 sun/moon toggle
1801
+ * (behavior-layer rule: mat-menu stays inside the lib, apps never import
1802
+ * @angular/material directly).
1803
+ *
1804
+ * <fx-ui-theme-picker />
1805
+ */
1806
+ declare class ThemePickerComponent {
1807
+ private themeService;
1808
+ readonly themes: readonly OgThemeMeta[];
1809
+ readonly current: _angular_core.Signal<OgTheme>;
1810
+ /** Tra trên bộ ĐẦY ĐỦ: theme đang active có thể là một trong 4 theme đã ẩn
1811
+ khỏi picker (deep-link /themes, localStorage cũ) — nhãn vẫn phải đúng. */
1812
+ currentMeta(): OgThemeMeta;
1813
+ select(theme: OgTheme): void;
1814
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ThemePickerComponent, never>;
1815
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ThemePickerComponent, "fx-ui-theme-picker", never, {}, {}, never, never, true, never>;
1816
+ }
1817
+
1818
+ /**
1819
+ * "Waiting on the backend" marker (anh Tú 29/08).
1820
+ *
1821
+ * Put this on any UI the V2 design calls for but no endpoint feeds yet, so the
1822
+ * gap is visible in the product instead of living only in a backlog file.
1823
+ * `grep -r "fx-ui-pending-badge"` then lists every outstanding field.
1824
+ *
1825
+ * <fx-ui-pending-badge [field]="'confirmed-chains weekly series'" />
1826
+ *
1827
+ * Keep the copy factual: it states that data is missing, never fakes a value.
1828
+ */
1829
+ declare class PendingBadgeComponent {
1830
+ /** Caller-translated chip text. */
1831
+ readonly label: _angular_core.InputSignal<string>;
1832
+ /**
1833
+ * What exactly is missing — shown as the title tooltip so a reviewer can read
1834
+ * the required field without opening the code.
1835
+ */
1836
+ readonly field: _angular_core.InputSignal<string>;
1837
+ /** 'chip' (default) sits inline; 'dot' is a bare marker for dense rows. */
1838
+ readonly variant: _angular_core.InputSignal<"chip" | "dot">;
1839
+ get tooltip(): string;
1840
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PendingBadgeComponent, never>;
1841
+ 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>;
1842
+ }
1843
+
1844
+ /**
1845
+ * Wraps UI that is rendered from PLACEHOLDER data so the layout can be
1846
+ * reviewed before its endpoint exists (anh Tú 29/08: "muốn có full giao diện
1847
+ * trước để review").
1848
+ *
1849
+ * The frame makes the status unmistakable — dashed outline, a corner label and
1850
+ * the pending marker naming the missing field — so sample shapes can never be
1851
+ * mistaken for measured values. Drop the wrapper (and the sample input) the
1852
+ * moment the API lands.
1853
+ *
1854
+ * The pending chip is inlined rather than composed from fx-ui-pending-badge:
1855
+ * one lib component importing another inside the same barrel tripped NG0919
1856
+ * (metadata read before definition) in consuming apps.
1857
+ *
1858
+ * <fx-ui-sample-frame [field]="'weekly activity'" [label]="'Sample layout'">
1859
+ * …chart rendered from sample series…
1860
+ * </fx-ui-sample-frame>
1861
+ */
1862
+ declare class SampleFrameComponent {
1863
+ /** Caller-translated corner label. */
1864
+ readonly label: _angular_core.InputSignal<string>;
1865
+ /** Field the backend still owes — shown on the pending badge tooltip. */
1866
+ readonly field: _angular_core.InputSignal<string>;
1867
+ /** Caller-translated pending-chip text. */
1868
+ readonly pendingLabel: _angular_core.InputSignal<string>;
1869
+ get tooltip(): string;
1870
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SampleFrameComponent, never>;
1871
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SampleFrameComponent, "fx-ui-sample-frame", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "field": { "alias": "field"; "required": false; "isSignal": true; }; "pendingLabel": { "alias": "pendingLabel"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1872
+ }
1873
+
1874
+ /**
1875
+ * V2 score badge — the risk/score chip used on attack-path rows, dashboard
1876
+ * panels and project tiles. Colour comes from the 0–100 risk band unless an
1877
+ * explicit tone is given (bands: ≥90 critical, ≥70 danger, ≥40 warning, else
1878
+ * success — same thresholds as value-tone's scoreTone on a 0–100 scale).
1879
+ */
1880
+ declare class ScoreBadgeComponent {
1881
+ readonly score: _angular_core.InputSignal<string | number>;
1882
+ /** Denominator shown as "98 / 100"; omit for a bare score. */
1883
+ readonly outOf: _angular_core.InputSignal<number | null>;
1884
+ /** Overrides the band-derived tone. */
1885
+ readonly tone: _angular_core.InputSignal<Tone | null>;
1886
+ readonly size: _angular_core.InputSignal<"sm" | "md" | "lg">;
1887
+ readonly resolvedTone: _angular_core.Signal<Tone | null>;
1888
+ badgeClass(): string;
1889
+ sizeClass(): string;
1890
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ScoreBadgeComponent, never>;
1891
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ScoreBadgeComponent, "fx-ui-score-badge", never, { "score": { "alias": "score"; "required": true; "isSignal": true; }; "outOf": { "alias": "outOf"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1892
+ }
1893
+
1894
+ /**
1895
+ * V2 StatusDot — tiny tone-coloured indicator used in list rows, project
1896
+ * cards and stat grids. Optional pulse for "live" states (running scans).
1897
+ *
1898
+ * <fx-ui-status-dot tone="success" />
1899
+ * <fx-ui-status-dot tone="warning" [pulse]="true" />
1900
+ */
1901
+ declare class StatusDotComponent {
1902
+ readonly tone: _angular_core.InputSignal<Tone | null>;
1903
+ /** Diameter in px. */
1904
+ readonly size: _angular_core.InputSignal<number>;
1905
+ readonly pulse: _angular_core.InputSignal<boolean>;
1906
+ dotClass(): string;
1907
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StatusDotComponent, never>;
1908
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StatusDotComponent, "fx-ui-status-dot", never, { "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "pulse": { "alias": "pulse"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1909
+ }
1910
+
1911
+ /**
1912
+ * V2 sparkbar — inline mini bar-trend (risk trend on project cards, deltas in
1913
+ * stat grids). Pure DOM, token-coloured; no chart engine.
1914
+ *
1915
+ * <fx-ui-sparkbar [values]="[3, 5, 2, 8, 6]" />
1916
+ */
1917
+ declare class SparkbarComponent {
1918
+ readonly values: _angular_core.InputSignal<number[]>;
1919
+ /** Bar colour; null renders the accent. */
1920
+ readonly tone: _angular_core.InputSignal<Tone | null>;
1921
+ readonly height: _angular_core.InputSignal<number>;
1922
+ readonly bars: _angular_core.Signal<number[]>;
1923
+ barClass(): string;
1924
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SparkbarComponent, never>;
1925
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SparkbarComponent, "fx-ui-sparkbar", never, { "values": { "alias": "values"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1926
+ }
1927
+
1928
+ interface FxSegmentedOption {
1929
+ value: string | number;
1930
+ /** Caller-translated label. */
1931
+ label: string;
1932
+ /** Optional hero-icon before the label. */
1933
+ icon?: string;
1934
+ /** Optional trailing count chip. */
1935
+ count?: number;
1936
+ disabled?: boolean;
1937
+ }
1938
+ /**
1939
+ * V2 segmented control — mode toggles (Essentials/Advanced), Catalog/Table
1940
+ * view switches, sub-navigation inside a tab. Generic n-option control; the
1941
+ * semantics live with the caller.
1942
+ *
1943
+ * Rendered as a compact pill group (anh Tú 29/08): equal-width options inside
1944
+ * a rounded-full track, with a single "thumb" that SLIDES to the active
1945
+ * option (transform transition — no per-button background repaint).
1946
+ *
1947
+ * <fx-ui-segmented [options]="modes" [(value)]="mode" />
1948
+ */
1949
+ declare class SegmentedComponent {
1950
+ readonly options: _angular_core.InputSignal<FxSegmentedOption[]>;
1951
+ readonly value: _angular_core.ModelSignal<string | number | null>;
1952
+ /** Accessible name for the group. */
1953
+ readonly ariaLabel: _angular_core.InputSignal<string>;
1954
+ /**
1955
+ * Both variants share the pill shape; they differ in the thumb fill:
1956
+ * 'default': raised surface thumb — view switches (Catalog/Table, ref 10).
1957
+ * 'pill': accent-filled thumb — the Essential/Advanced depth toggle
1958
+ * (design refs 04/05).
1959
+ */
1960
+ readonly variant: _angular_core.InputSignal<"default" | "pill">;
1961
+ /** Index the sliding thumb sits on; -1 hides it (no/unknown selection). */
1962
+ readonly activeIndex: _angular_core.Signal<number>;
1963
+ /** Equal-width tracks → the thumb is 1/n of the inner width and slides by
1964
+ * multiples of its own width. Pure CSS transform, nothing to measure. */
1965
+ readonly thumbWidth: _angular_core.Signal<string>;
1966
+ readonly thumbTransform: _angular_core.Signal<string>;
1967
+ select(option: FxSegmentedOption): void;
1968
+ thumbClass(): string;
1969
+ optionClass(option: FxSegmentedOption): string;
1970
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SegmentedComponent, never>;
1971
+ 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>;
1972
+ }
1973
+
1974
+ interface FxListRowBadge {
1975
+ /** Caller-translated label. */
1976
+ label: string;
1977
+ tone?: Tone | null;
1978
+ }
1979
+ /**
1980
+ * V2 ListRow — presentational body for master-detail #row templates and other
1981
+ * selectable lists: status dot + title, trailing badges, meta line. Extra
1982
+ * content projects below the meta line.
1983
+ *
1984
+ * <ng-template #row let-item>
1985
+ * <fx-ui-list-row
1986
+ * [title]="item.name"
1987
+ * [meta]="item.version + ' · ' + item.date"
1988
+ * [dotTone]="statusTone(item)"
1989
+ * [badges]="[{ label: item.severity, tone: severityTone(item.severity) }]"
1990
+ * />
1991
+ * </ng-template>
1992
+ */
1993
+ declare class ListRowComponent {
1994
+ readonly title: _angular_core.InputSignal<string>;
1995
+ readonly meta: _angular_core.InputSignal<string>;
1996
+ readonly badges: _angular_core.InputSignal<FxListRowBadge[]>;
1997
+ readonly dotTone: _angular_core.InputSignal<Tone | null | undefined>;
1998
+ readonly dotPulse: _angular_core.InputSignal<boolean>;
1999
+ badgeClass(badge: FxListRowBadge): string;
2000
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ListRowComponent, never>;
2001
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ListRowComponent, "fx-ui-list-row", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "meta": { "alias": "meta"; "required": false; "isSignal": true; }; "badges": { "alias": "badges"; "required": false; "isSignal": true; }; "dotTone": { "alias": "dotTone"; "required": false; "isSignal": true; }; "dotPulse": { "alias": "dotPulse"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2002
+ }
2003
+
2004
+ interface FxBarListItem {
2005
+ /** Caller-translated label. */
2006
+ label: string;
2007
+ value: number;
2008
+ /** Shown instead of the raw value (e.g. "9.8", "82%"). */
2009
+ valueLabel?: string;
2010
+ /** Bar colour; null/undefined renders the accent. */
2011
+ tone?: Tone | null;
2012
+ /** Secondary line under the label. */
2013
+ meta?: string;
2014
+ /** Free-form identifier handed back on (select). */
2015
+ data?: any;
2016
+ }
2017
+ /**
2018
+ * V2 BarList — ranked horizontal bars ("Top projects by risk", "Top critical
2019
+ * attack paths"). Pure DOM (accessible, token-native, clickable) — charts via
2020
+ * ECharts are for time series, not rankings.
2021
+ *
2022
+ * <fx-ui-bar-list [items]="topRisk" (select)="open($event)" />
2023
+ */
2024
+ declare class BarListComponent {
2025
+ readonly items: _angular_core.InputSignal<FxBarListItem[]>;
2026
+ /** Rows render as buttons only when true (a (select) listener exists). */
2027
+ readonly interactive: _angular_core.InputSignal<boolean>;
2028
+ readonly select: _angular_core.OutputEmitterRef<FxBarListItem>;
2029
+ readonly max: _angular_core.Signal<number>;
2030
+ widthOf(item: FxBarListItem): number;
2031
+ barClass(item: FxBarListItem): string;
2032
+ onSelect(item: FxBarListItem): void;
2033
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BarListComponent, never>;
2034
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BarListComponent, "fx-ui-bar-list", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; }, { "select": "select"; }, never, never, true, never>;
2035
+ }
2036
+
2037
+ interface FxFacetOption {
2038
+ value: string | number;
2039
+ /** Caller-translated label. */
2040
+ label: string;
2041
+ count?: number;
2042
+ /** Optional tone dot before the label (severity facets). */
2043
+ tone?: Tone | null;
2044
+ }
2045
+ interface FxFacetGroup {
2046
+ id: string;
2047
+ /** Caller-translated group heading. */
2048
+ label: string;
2049
+ /** Multi-select (checkbox semantics); default single-select toggle. */
2050
+ multi?: boolean;
2051
+ options: FxFacetOption[];
2052
+ }
2053
+ type FxFacetSelection = Record<string, (string | number)[]>;
2054
+ /**
2055
+ * V2 facets rail — the first column of 3-column lookup screens: filter groups
2056
+ * with counts + a Reset link. Presentational: filtering itself stays in the
2057
+ * page (feed the emitted selection into BaseMasterDetail filters).
2058
+ *
2059
+ * <div mdFacets>
2060
+ * <fx-ui-facets-rail [groups]="facetGroups" [selection]="facets"
2061
+ * (selectionChange)="onFacets($event)" />
2062
+ * </div>
2063
+ */
2064
+ declare class FacetsRailComponent {
2065
+ readonly groups: _angular_core.InputSignal<FxFacetGroup[]>;
2066
+ readonly selection: _angular_core.InputSignal<FxFacetSelection>;
2067
+ /** Caller-translated label for the reset affordance. */
2068
+ readonly resetLabel: _angular_core.InputSignal<string>;
2069
+ readonly selectionChange: _angular_core.OutputEmitterRef<FxFacetSelection>;
2070
+ readonly hasSelection: _angular_core.Signal<boolean>;
2071
+ isSelected(group: FxFacetGroup, option: FxFacetOption): boolean;
2072
+ toggle(group: FxFacetGroup, option: FxFacetOption): void;
2073
+ reset(): void;
2074
+ toneClass(option: FxFacetOption): string;
2075
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FacetsRailComponent, never>;
2076
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FacetsRailComponent, "fx-ui-facets-rail", never, { "groups": { "alias": "groups"; "required": false; "isSignal": true; }; "selection": { "alias": "selection"; "required": false; "isSignal": true; }; "resetLabel": { "alias": "resetLabel"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; }, never, never, true, never>;
2077
+ }
2078
+
2079
+ interface FxProjectCardChip {
2080
+ /** Caller-translated label. */
2081
+ label: string;
2082
+ tone?: Tone | null;
2083
+ }
2084
+ interface FxProjectCardMetric {
2085
+ /** Caller-formatted figure ("128", "--"). */
2086
+ value: string | number;
2087
+ /** Caller-translated caption under the figure. */
2088
+ label: string;
2089
+ }
2090
+ interface FxProjectCard {
2091
+ name: string;
2092
+ description?: string;
2093
+ /** 1–2 char initials rendered in an accent-soft square (design 12). */
2094
+ avatar?: string;
2095
+ /** Small line under the name (schedule / scope) with an optional hero-icon. */
2096
+ sub?: {
2097
+ icon?: string;
2098
+ label: string;
2099
+ };
2100
+ /** Score chip top-right ("High · 82"); rendered as a toned pill. */
2101
+ score?: string | number;
2102
+ scoreTone?: Tone | null;
2103
+ /** Caption under the score chip (kept for pre-V2 callers). */
2104
+ scoreLabel?: string;
2105
+ /** Risk-trend sparkbar values (pre-V2 look; prefer `trend`). */
2106
+ spark?: number[];
2107
+ /**
2108
+ * Design-12 risk trend: one toned block per period, oldest first, with a
2109
+ * caption line underneath ("risk trend" · "128 analyses").
2110
+ */
2111
+ trend?: {
2112
+ tones: (Tone | null)[];
2113
+ caption?: string;
2114
+ aside?: string;
2115
+ };
2116
+ chips?: FxProjectCardChip[];
2117
+ /** Metric columns (Binaries · Findings · …): figure + caption. */
2118
+ metrics?: FxProjectCardMetric[];
2119
+ /** Footer meta line (e.g. "Last analysis · 2d ago"). */
2120
+ meta?: string;
2121
+ /** Footer link label right of the meta ("Open ›"); the whole card emits (open). */
2122
+ openLabel?: string;
2123
+ /** Free-form identifier handed back on (open). */
2124
+ data?: any;
2125
+ }
2126
+ /**
2127
+ * V2 project card — the Project Management catalog tile (design 12): initials
2128
+ * avatar + name + schedule line, toned score chip, risk-trend blocks, metric
2129
+ * columns and a "Last analysis · … / Open ›" footer.
2130
+ *
2131
+ * <fx-ui-project-card [card]="project" (open)="goTo(project)" />
2132
+ */
2133
+ declare class ProjectCardComponent {
2134
+ readonly card: _angular_core.InputSignal<FxProjectCard>;
2135
+ readonly open: _angular_core.OutputEmitterRef<FxProjectCard>;
2136
+ scoreChipClass(): string;
2137
+ chipClass(chip: FxProjectCardChip): string;
2138
+ blockClass(tone: Tone | null): string;
2139
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ProjectCardComponent, never>;
2140
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ProjectCardComponent, "fx-ui-project-card", never, { "card": { "alias": "card"; "required": true; "isSignal": true; }; }, { "open": "open"; }, never, never, true, never>;
2141
+ }
2142
+
2143
+ type FxPipelineStageState = 'pending' | 'active' | 'done' | 'error';
2144
+ interface FxPipelineStage {
2145
+ id: string;
2146
+ /** Caller-translated label. */
2147
+ label: string;
2148
+ state?: FxPipelineStageState;
2149
+ /** Small line under the label (e.g. "optional", a duration). */
2150
+ description?: string;
2151
+ }
2152
+ /**
2153
+ * V2 pipeline stepper — the New Analysis 7-stage pipeline header. Renders the
2154
+ * stage strip only; the page owns the stage bodies (project the current one
2155
+ * below). Stage states are data — the parent decides what is done/active.
2156
+ *
2157
+ * <fx-ui-pipeline-stepper [stages]="stages" (stageClick)="goTo($event)">
2158
+ * …current stage body…
2159
+ * </fx-ui-pipeline-stepper>
2160
+ */
2161
+ declare class PipelineStepperComponent {
2162
+ readonly stages: _angular_core.InputSignal<FxPipelineStage[]>;
2163
+ /** Only done stages are click-navigable (review a completed step). */
2164
+ readonly clickable: _angular_core.InputSignal<boolean>;
2165
+ readonly stageClick: _angular_core.OutputEmitterRef<number>;
2166
+ stateOf(stage: FxPipelineStage): FxPipelineStageState;
2167
+ circleClass(stage: FxPipelineStage): string;
2168
+ labelClass(stage: FxPipelineStage): string;
2169
+ connectorClass(stage: FxPipelineStage): string;
2170
+ canClick(stage: FxPipelineStage): boolean;
2171
+ onStageClick(stage: FxPipelineStage, index: number): void;
2172
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PipelineStepperComponent, never>;
2173
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PipelineStepperComponent, "fx-ui-pipeline-stepper", never, { "stages": { "alias": "stages"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; }, { "stageClick": "stageClick"; }, never, ["*"], true, never>;
1553
2174
  }
1554
2175
 
1555
2176
  declare class ConfirmationDialogComponent {
@@ -1563,24 +2184,26 @@ declare class ConfirmationDialogComponent {
1563
2184
  constructor(ref: MatDialogRef<ConfirmationDialogComponent>, bindings: any);
1564
2185
  accept(): Promise<void>;
1565
2186
  cancel(): void;
1566
- static ɵfac: i0.ɵɵFactoryDeclaration<ConfirmationDialogComponent, never>;
1567
- static ɵcmp: i0.ɵɵComponentDeclaration<ConfirmationDialogComponent, "fx-ui-confirmation-dialog", never, {}, {}, never, never, false, never>;
1568
- }
1569
-
1570
- declare const MY_MOMENT_FORMATS: {
1571
- parseInput: string;
1572
- fullPickerInput: string;
1573
- datePickerInput: string;
1574
- timePickerInput: string;
1575
- monthYearLabel: string;
1576
- dateA11yLabel: string;
1577
- monthYearA11yLabel: string;
1578
- };
2187
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ConfirmationDialogComponent, never>;
2188
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ConfirmationDialogComponent, "fx-ui-confirmation-dialog", never, {}, {}, never, never, true, never>;
2189
+ }
2190
+
2191
+ /**
2192
+ * Compatibility barrel over the (now standalone) core components.
2193
+ *
2194
+ * Deliberately NOT re-exported anymore: Angular Material —
2195
+ * Material is a behavior layer that stays an
2196
+ * implementation detail of this lib (Playbook §5.1); each standalone
2197
+ * component imports what it needs itself. Apps consume fx-ui-* only.
2198
+ *
2199
+ * Heavy components live in secondary entry points and are not part of this
2200
+ * barrel: @foxeltech/angular-ui/chart, /flow, /rich-text.
2201
+ */
1579
2202
  declare class UiModule {
1580
- static ɵfac: i0.ɵɵFactoryDeclaration<UiModule, never>;
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]>;
1582
- static ɵinj: i0.ɵɵInjectorDeclaration<UiModule>;
2203
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiModule, never>;
2204
+ 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 SkeletonTableLoadingComponent, 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 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 SkeletonTableLoadingComponent, 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 ConfirmationDialogComponent, typeof i1$1.FormsModule, typeof i1$1.ReactiveFormsModule, typeof i2.RouterModule, typeof HasPermissionDirective, typeof TrimOnBlurDirective]>;
2205
+ static ɵinj: _angular_core.ɵɵInjectorDeclaration<UiModule>;
1583
2206
  }
1584
2207
 
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 };
2208
+ export { AuthInterceptor, AuthStateService, BarListComponent, BaseComponent, BaseDialogComponent, BaseMasterDetailComponent, BaseResolver, BaseTableComponent, BreadcrumbService, ButtonComponent, CheckboxComponent, CircleProgressBar, CodeBlockComponent, ConfirmationDialogComponent, DatetimePicker, DndUploadComponent, DrawerComponent, EmptyStateComponent, FX_ICON_SPRITE_URL, FacetsRailComponent, FilterChipsComponent, FilterPillsComponent, FxComponent, FxDialogService, FxLoadingService, 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, SampleFrameComponent, ScoreBadgeComponent, ScreenshotFrameComponent, SearchBarComponent, SectionCardComponent, SegmentedComponent, SelectComponent, SeverityBadgesComponent, SkeletonDetailComponent, SkeletonListComponent, SkeletonTableLoadingComponent, 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, toneBg, toneColor, toneText };
2209
+ 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, FxStatCard, FxStatCardDelta, FxTableFilters, IRadioButton, KanbanColumn, NotificationCallback, NotificationConnectOptions, OgTheme, OgThemeMeta, RealtimeTableEvent, RealtimeTableSyncOptions, TableResult, TagType, ToastData, Tone, TreeNode, UploadResult };