@foxeltech/angular-ui 0.4.0 → 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 (165) 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 +185 -17
  16. package/fesm2022/foxeltech-angular-ui-chart.mjs.map +1 -1
  17. package/fesm2022/foxeltech-angular-ui-flow.mjs +176 -3
  18. package/fesm2022/foxeltech-angular-ui-flow.mjs.map +1 -1
  19. package/fesm2022/foxeltech-angular-ui-rich-text.mjs +2 -2
  20. package/fesm2022/foxeltech-angular-ui-rich-text.mjs.map +1 -1
  21. package/fesm2022/foxeltech-angular-ui.mjs +849 -69
  22. package/fesm2022/foxeltech-angular-ui.mjs.map +1 -1
  23. package/fonts.css +462 -138
  24. package/ibm-plex-mono/ibm-plex-mono-400-cyrillic-ext.woff2 +0 -0
  25. package/ibm-plex-mono/ibm-plex-mono-400-cyrillic.woff2 +0 -0
  26. package/ibm-plex-mono/ibm-plex-mono-400-latin-ext.woff2 +0 -0
  27. package/ibm-plex-mono/ibm-plex-mono-400-latin.woff2 +0 -0
  28. package/ibm-plex-mono/ibm-plex-mono-400-vietnamese.woff2 +0 -0
  29. package/ibm-plex-mono/ibm-plex-mono-500-cyrillic-ext.woff2 +0 -0
  30. package/ibm-plex-mono/ibm-plex-mono-500-cyrillic.woff2 +0 -0
  31. package/ibm-plex-mono/ibm-plex-mono-500-latin-ext.woff2 +0 -0
  32. package/ibm-plex-mono/ibm-plex-mono-500-latin.woff2 +0 -0
  33. package/ibm-plex-mono/ibm-plex-mono-500-vietnamese.woff2 +0 -0
  34. package/ibm-plex-mono/ibm-plex-mono-600-cyrillic-ext.woff2 +0 -0
  35. package/ibm-plex-mono/ibm-plex-mono-600-cyrillic.woff2 +0 -0
  36. package/ibm-plex-mono/ibm-plex-mono-600-latin-ext.woff2 +0 -0
  37. package/ibm-plex-mono/ibm-plex-mono-600-latin.woff2 +0 -0
  38. package/ibm-plex-mono/ibm-plex-mono-600-vietnamese.woff2 +0 -0
  39. package/jetbrains-mono/jetbrains-mono-400-cyrillic-ext.woff2 +0 -0
  40. package/jetbrains-mono/jetbrains-mono-400-cyrillic.woff2 +0 -0
  41. package/jetbrains-mono/jetbrains-mono-400-greek.woff2 +0 -0
  42. package/jetbrains-mono/jetbrains-mono-400-latin-ext.woff2 +0 -0
  43. package/jetbrains-mono/jetbrains-mono-400-latin.woff2 +0 -0
  44. package/jetbrains-mono/jetbrains-mono-400-vietnamese.woff2 +0 -0
  45. package/jetbrains-mono/jetbrains-mono-500-cyrillic-ext.woff2 +0 -0
  46. package/jetbrains-mono/jetbrains-mono-500-cyrillic.woff2 +0 -0
  47. package/jetbrains-mono/jetbrains-mono-500-greek.woff2 +0 -0
  48. package/jetbrains-mono/jetbrains-mono-500-latin-ext.woff2 +0 -0
  49. package/jetbrains-mono/jetbrains-mono-500-latin.woff2 +0 -0
  50. package/jetbrains-mono/jetbrains-mono-500-vietnamese.woff2 +0 -0
  51. package/jetbrains-mono/jetbrains-mono-600-cyrillic-ext.woff2 +0 -0
  52. package/jetbrains-mono/jetbrains-mono-600-cyrillic.woff2 +0 -0
  53. package/jetbrains-mono/jetbrains-mono-600-greek.woff2 +0 -0
  54. package/jetbrains-mono/jetbrains-mono-600-latin-ext.woff2 +0 -0
  55. package/jetbrains-mono/jetbrains-mono-600-latin.woff2 +0 -0
  56. package/jetbrains-mono/jetbrains-mono-600-vietnamese.woff2 +0 -0
  57. package/jetbrains-mono/jetbrains-mono-700-cyrillic-ext.woff2 +0 -0
  58. package/jetbrains-mono/jetbrains-mono-700-cyrillic.woff2 +0 -0
  59. package/jetbrains-mono/jetbrains-mono-700-greek.woff2 +0 -0
  60. package/jetbrains-mono/jetbrains-mono-700-latin-ext.woff2 +0 -0
  61. package/jetbrains-mono/jetbrains-mono-700-latin.woff2 +0 -0
  62. package/jetbrains-mono/jetbrains-mono-700-vietnamese.woff2 +0 -0
  63. package/newsreader/newsreader-400-latin-ext.woff2 +0 -0
  64. package/newsreader/newsreader-400-latin.woff2 +0 -0
  65. package/newsreader/newsreader-400-vietnamese.woff2 +0 -0
  66. package/newsreader/newsreader-500-latin-ext.woff2 +0 -0
  67. package/newsreader/newsreader-500-latin.woff2 +0 -0
  68. package/newsreader/newsreader-500-vietnamese.woff2 +0 -0
  69. package/newsreader/newsreader-600-latin-ext.woff2 +0 -0
  70. package/newsreader/newsreader-600-latin.woff2 +0 -0
  71. package/newsreader/newsreader-600-vietnamese.woff2 +0 -0
  72. package/package.json +5 -2
  73. package/source-serif-4/source-serif-4-400-cyrillic-ext.woff2 +0 -0
  74. package/source-serif-4/source-serif-4-400-cyrillic.woff2 +0 -0
  75. package/source-serif-4/source-serif-4-400-greek.woff2 +0 -0
  76. package/source-serif-4/source-serif-4-400-latin-ext.woff2 +0 -0
  77. package/source-serif-4/source-serif-4-400-latin.woff2 +0 -0
  78. package/source-serif-4/source-serif-4-400-vietnamese.woff2 +0 -0
  79. package/source-serif-4/source-serif-4-600-cyrillic-ext.woff2 +0 -0
  80. package/source-serif-4/source-serif-4-600-cyrillic.woff2 +0 -0
  81. package/source-serif-4/source-serif-4-600-greek.woff2 +0 -0
  82. package/source-serif-4/source-serif-4-600-latin-ext.woff2 +0 -0
  83. package/source-serif-4/source-serif-4-600-latin.woff2 +0 -0
  84. package/source-serif-4/source-serif-4-600-vietnamese.woff2 +0 -0
  85. package/src/lib/styles/components.css +12 -12
  86. package/src/lib/styles/dialogs.css +2 -2
  87. package/src/lib/styles/fonts.css +462 -138
  88. package/src/lib/styles/tailwind.css +1 -1
  89. package/src/lib/styles/theme.css +596 -69
  90. package/src/lib/styles/tokens.css +56 -19
  91. package/src/lib/styles/utilities.css +4 -1
  92. package/src/lib/ui/components/bar-list/bar-list.component.html +29 -0
  93. package/src/lib/ui/components/button/button.component.html +7 -5
  94. package/src/lib/ui/components/checkbox/checkbox.component.html +1 -1
  95. package/src/lib/ui/components/code-block/code-block.component.html +8 -0
  96. package/src/lib/ui/components/drawer/drawer.component.html +35 -12
  97. package/src/lib/ui/components/drawer/drawer.component.scss +104 -18
  98. package/src/lib/ui/components/facets-rail/facets-rail.component.html +42 -0
  99. package/src/lib/ui/components/filter-pills/filter-pills.component.html +16 -0
  100. package/src/lib/ui/components/kanban-board/kanban-board.component.scss +9 -9
  101. package/src/lib/ui/components/list-row/list-row.component.html +20 -0
  102. package/src/lib/ui/components/master-detail/master-detail.component.css +22 -0
  103. package/src/lib/ui/components/master-detail/master-detail.component.html +33 -1
  104. package/src/lib/ui/components/pending-badge/pending-badge.component.html +15 -0
  105. package/src/lib/ui/components/pipeline-stepper/pipeline-stepper.component.html +45 -0
  106. package/src/lib/ui/components/project-card/project-card.component.html +102 -0
  107. package/src/lib/ui/components/radio-button/radio-button.component.html +1 -1
  108. package/src/lib/ui/components/radio-button-toggle/radio-button-toggle.component.html +1 -1
  109. package/src/lib/ui/components/sample-frame/sample-frame.component.html +18 -0
  110. package/src/lib/ui/components/score-badge/score-badge.component.html +7 -0
  111. package/src/lib/ui/components/screenshot-frame/screenshot-frame.component.html +40 -0
  112. package/src/lib/ui/components/section-card/section-card.component.html +19 -6
  113. package/src/lib/ui/components/segmented/segmented.component.html +42 -0
  114. package/src/lib/ui/components/segmented/segmented.component.scss +12 -0
  115. package/src/lib/ui/components/slider/slider.component.html +2 -2
  116. package/src/lib/ui/components/sparkbar/sparkbar.component.html +14 -0
  117. package/src/lib/ui/components/stage-dots/stage-dots.component.html +13 -0
  118. package/src/lib/ui/components/stat-cards/stat-cards.component.html +44 -11
  119. package/src/lib/ui/components/status-dot/status-dot.component.html +13 -0
  120. package/src/lib/ui/components/tab-group/tab-group.component.html +37 -8
  121. package/src/lib/ui/components/tab-group/tab-group.component.scss +41 -1
  122. package/src/lib/ui/components/tag/tag.component.html +2 -2
  123. package/src/lib/ui/components/theme-picker/theme-picker.component.html +44 -0
  124. package/src/lib/ui/components/tree-diagram/tree-diagram.component.html +3 -3
  125. package/tailwind.css +1 -1
  126. package/theme.css +596 -69
  127. package/tokens.css +56 -19
  128. package/types/foxeltech-angular-ui-chart.d.ts +14 -2
  129. package/types/foxeltech-angular-ui-flow.d.ts +83 -1
  130. package/types/foxeltech-angular-ui.d.ts +636 -20
  131. package/utilities.css +4 -1
  132. package/BeVietnamPro/BeVietnamPro-Bold.woff2 +0 -0
  133. package/BeVietnamPro/BeVietnamPro-ExtraLight.woff2 +0 -0
  134. package/BeVietnamPro/BeVietnamPro-Light.woff2 +0 -0
  135. package/BeVietnamPro/BeVietnamPro-Medium.woff2 +0 -0
  136. package/BeVietnamPro/BeVietnamPro-Regular.woff2 +0 -0
  137. package/BeVietnamPro/BeVietnamPro-SemiBold.woff2 +0 -0
  138. package/BeVietnamPro/BeVietnamPro-Thin.woff2 +0 -0
  139. package/SpaceMono-Regular.woff2 +0 -0
  140. package/dm-sans/DMSans-Bold.woff2 +0 -0
  141. package/dm-sans/DMSans-Light.woff2 +0 -0
  142. package/dm-sans/DMSans-Medium.woff2 +0 -0
  143. package/dm-sans/DMSans-Regular.woff2 +0 -0
  144. package/dm-sans/DMSans-SemiBold.woff2 +0 -0
  145. package/dm-sans/DMSans-Thin.woff2 +0 -0
  146. package/orbitron/Orbitron-Bold.woff2 +0 -0
  147. package/orbitron/Orbitron-Medium.woff2 +0 -0
  148. package/orbitron/Orbitron-Regular.woff2 +0 -0
  149. package/orbitron/Orbitron-SemiBold.woff2 +0 -0
  150. package/roboto/Roboto-Black.woff2 +0 -0
  151. package/roboto/Roboto-BlackItalic.woff2 +0 -0
  152. package/roboto/Roboto-Bold.woff2 +0 -0
  153. package/roboto/Roboto-BoldCondensed.woff2 +0 -0
  154. package/roboto/Roboto-BoldCondensedItalic.woff2 +0 -0
  155. package/roboto/Roboto-BoldItalic.woff2 +0 -0
  156. package/roboto/Roboto-Condensed.woff2 +0 -0
  157. package/roboto/Roboto-CondensedItalic.woff2 +0 -0
  158. package/roboto/Roboto-Italic.woff2 +0 -0
  159. package/roboto/Roboto-Light.woff2 +0 -0
  160. package/roboto/Roboto-LightItalic.woff2 +0 -0
  161. package/roboto/Roboto-Medium.woff2 +0 -0
  162. package/roboto/Roboto-MediumItalic.woff2 +0 -0
  163. package/roboto/Roboto-Regular.woff2 +0 -0
  164. package/roboto/Roboto-Thin.woff2 +0 -0
  165. package/roboto/Roboto-ThinItalic.woff2 +0 -0
@@ -1,5 +1,5 @@
1
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, Renderer2, InjectionToken, QueryList, NgZone } 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
4
  import { MatDialog, MatDialogRef, MatDialogConfig } from '@angular/material/dialog';
5
5
  import { MatPaginator, PageEvent } from '@angular/material/paginator';
@@ -509,6 +509,14 @@ declare class FxUtils {
509
509
  static convertColorFromVariable(name: string, alpha?: number, options?: {
510
510
  legacyCommaSyntax?: boolean;
511
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
+ */
512
520
  static getTagClass(key: string, isCriticalExist?: boolean): TagType;
513
521
  static validateEmail(value: string): boolean;
514
522
  /** Safe deep accessor with the org-wide empty placeholder. */
@@ -580,6 +588,25 @@ declare function toneBadge(tone: Tone | null): string;
580
588
  */
581
589
  declare function toneColor(tone: Tone | null, alpha?: number): string;
582
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
+
583
610
  declare class FxValidators {
584
611
  /**
585
612
  * Name fields: firstName, lastName, groupName, projectName, displayName
@@ -741,18 +768,54 @@ declare class BreadcrumbService {
741
768
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<BreadcrumbService>;
742
769
  }
743
770
 
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;
782
+ }
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
+ */
744
801
  declare class ThemeService {
745
802
  private renderer;
746
803
  private lightClass;
747
804
  private theme$;
748
805
  themeStorageKey: string;
749
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. */
750
813
  setLightMode(enable: boolean): void;
814
+ /** @deprecated V2: use setTheme(). Flips between the two default themes. */
751
815
  toggleTheme(): void;
752
- themeChanges(): rxjs.Observable<"light" | "dark">;
753
- getCurrentTheme(): 'light' | 'dark';
754
- isLight(): boolean;
755
816
  getLogoPath(): string;
817
+ private isLightTheme;
818
+ private readSavedTheme;
756
819
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ThemeService, never>;
757
820
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<ThemeService>;
758
821
  }
@@ -1059,6 +1122,9 @@ declare class LoadingPanel {
1059
1122
 
1060
1123
  declare class SearchBarComponent extends FxComponent<string> implements AfterViewInit {
1061
1124
  private ref;
1125
+ /** FxComponent leaves `value` undefined; without ngModel the input would
1126
+ render the literal string "undefined". */
1127
+ value: string;
1062
1128
  readonly placeholder: _angular_core.InputSignal<string>;
1063
1129
  readonly search: _angular_core.OutputEmitterRef<string>;
1064
1130
  readonly valueChange: _angular_core.OutputEmitterRef<string>;
@@ -1075,18 +1141,29 @@ declare class SearchBarComponent extends FxComponent<string> implements AfterVie
1075
1141
  declare class TabComponent {
1076
1142
  readonly label: _angular_core.InputSignal<string>;
1077
1143
  icon?: string;
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>;
1078
1148
  readonly content: _angular_core.Signal<TemplateRef<any>>;
1079
1149
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TabComponent, never>;
1080
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TabComponent, "fx-ui-tab", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; }; }, {}, never, ["*"], true, 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>;
1081
1151
  }
1082
1152
 
1083
- declare class TabGroupComponent implements AfterContentInit {
1153
+ declare class TabGroupComponent implements AfterContentInit, AfterViewChecked, OnChanges {
1084
1154
  private renderer;
1085
1155
  private cdr;
1086
1156
  readonly tabs: _angular_core.Signal<readonly TabComponent[]>;
1087
1157
  activeIndex: number;
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">;
1088
1162
  readonly tabListRef: _angular_core.Signal<ElementRef<HTMLElement>>;
1089
- readonly underlineRef: _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;
1090
1167
  canScrollLeft: boolean;
1091
1168
  canScrollRight: boolean;
1092
1169
  private animateDelay;
@@ -1095,8 +1172,19 @@ declare class TabGroupComponent implements AfterContentInit {
1095
1172
  constructor(renderer: Renderer2);
1096
1173
  ngAfterContentInit(): void;
1097
1174
  selectTab(index: number): void;
1175
+ badgeClass(tab: TabComponent): string;
1098
1176
  /** Roving tablist keyboard nav: arrows move AND activate (selection follows focus). */
1099
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;
1100
1188
  private updateUnderlinePosition;
1101
1189
  private scrollToActiveTab;
1102
1190
  scroll(direction: 'left' | 'right'): void;
@@ -1104,7 +1192,7 @@ declare class TabGroupComponent implements AfterContentInit {
1104
1192
  private updateScrollButtons;
1105
1193
  onResize(): void;
1106
1194
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TabGroupComponent, never>;
1107
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TabGroupComponent, "fx-ui-tab-group", never, { "activeIndex": { "alias": "activeIndex"; "required": false; }; }, {}, ["tabs"], never, true, 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>;
1108
1196
  }
1109
1197
 
1110
1198
  /**
@@ -1304,6 +1392,8 @@ interface DrawerItem {
1304
1392
  id: string;
1305
1393
  label: string;
1306
1394
  icon: string;
1395
+ /** V2: renders as a non-interactive section caption (flat nav, no accordion). */
1396
+ heading?: boolean;
1307
1397
  route?: string;
1308
1398
  children?: DrawerItem[];
1309
1399
  action?: () => void;
@@ -1313,8 +1403,15 @@ declare class DrawerComponent implements OnInit, OnDestroy {
1313
1403
  private router;
1314
1404
  private cdr;
1315
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[]>;
1316
1409
  isExpanded: boolean;
1317
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;
1318
1415
  version?: string;
1319
1416
  readonly toggleExpanded: _angular_core.OutputEmitterRef<boolean>;
1320
1417
  readonly itemClicked: _angular_core.OutputEmitterRef<DrawerItem>;
@@ -1334,7 +1431,7 @@ declare class DrawerComponent implements OnInit, OnDestroy {
1334
1431
  getAccordionState(itemId: string): string;
1335
1432
  getDrawerState(): string;
1336
1433
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DrawerComponent, never>;
1337
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DrawerComponent, "fx-ui-drawer", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "isExpanded": { "alias": "isExpanded"; "required": false; }; "logo": { "alias": "logo"; "required": false; }; "version": { "alias": "version"; "required": false; }; }, { "toggleExpanded": "toggleExpanded"; "itemClicked": "itemClicked"; }, never, never, true, 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>;
1338
1435
  }
1339
1436
 
1340
1437
  /** Row-card skeleton placeholder for master-detail list panes. */
@@ -1357,6 +1454,13 @@ declare class SkeletonDetailComponent {
1357
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>;
1358
1455
  }
1359
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
+ }
1360
1464
  interface FxStatCard {
1361
1465
  /** Caller-translated caption. */
1362
1466
  label: string;
@@ -1365,17 +1469,33 @@ interface FxStatCard {
1365
1469
  icon?: string;
1366
1470
  /** Colours the number and the icon box; null/undefined renders neutral. */
1367
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;
1368
1480
  }
1369
1481
  /** KPI tile row: big number + tinted icon box + caption, in a responsive grid. */
1370
1482
  declare class StatCardsComponent {
1371
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">;
1372
1490
  /** Grid columns; defaults to one column per card. */
1373
1491
  cols?: number;
1374
1492
  get gridColumns(): string;
1375
1493
  numClass(card: FxStatCard): string;
1376
1494
  boxClass(card: FxStatCard): string;
1495
+ deltaClass(card: FxStatCard): string;
1496
+ subClass(card: FxStatCard): string;
1377
1497
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StatCardsComponent, never>;
1378
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StatCardsComponent, "fx-ui-stat-cards", never, { "cards": { "alias": "cards"; "required": false; "isSignal": true; }; "cols": { "alias": "cols"; "required": false; }; }, {}, never, never, true, 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>;
1379
1499
  }
1380
1500
 
1381
1501
  /** Centered "no data" block. The message is caller-translated (no i18n in lib). */
@@ -1412,6 +1532,100 @@ declare class FilterChipsComponent {
1412
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>;
1413
1533
  }
1414
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>;
1627
+ }
1628
+
1415
1629
  /** Thin tone-coloured progress/score bar with optional label and caption. */
1416
1630
  declare class MeterComponent {
1417
1631
  value: number;
@@ -1426,16 +1640,24 @@ declare class MeterComponent {
1426
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>;
1427
1641
  }
1428
1642
 
1429
- /** 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
+ */
1430
1649
  declare class SectionCardComponent {
1431
1650
  /** Caller-translated heading. */
1432
1651
  readonly title: _angular_core.InputSignal<string>;
1433
1652
  /** hero-icon name; omitted → text-only header. */
1434
1653
  icon?: any;
1435
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>;
1436
1658
  get iconClass(): string;
1437
1659
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SectionCardComponent, never>;
1438
- 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; }; }, {}, never, ["*"], true, 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>;
1439
1661
  }
1440
1662
 
1441
1663
  /**
@@ -1490,11 +1712,13 @@ declare class SeverityBadgesComponent {
1490
1712
  }
1491
1713
 
1492
1714
  /**
1493
- * Two-column master-detail shell driven by a BaseMasterDetailComponent.
1494
- * The host page projects its own header/filters and supplies templates for
1495
- * 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:
1496
1719
  *
1497
1720
  * <fx-ui-master-detail [table]="this" [emptyMessage]="'noData' | translate">
1721
+ * <div mdFacets>…<fx-ui-facets-rail …/>…</div> <!-- optional, V2 -->
1498
1722
  * <div mdHeader>…title / stat cards…</div>
1499
1723
  * <div mdFilters>…search bar / filter chips…</div>
1500
1724
  * <ng-template #row let-item let-selected="selected">…row body…</ng-template>
@@ -1504,7 +1728,10 @@ declare class SeverityBadgesComponent {
1504
1728
  * The list behaves as a single-select listbox: the selected option is the
1505
1729
  * tab stop, ArrowUp/Down/Home/End move the selection.
1506
1730
  */
1507
- 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;
1508
1735
  table: BaseMasterDetailComponent<any>;
1509
1736
  /** Fixed list-pane width on lg+ viewports (stacked full-width below). */
1510
1737
  readonly listWidth: _angular_core.InputSignal<string>;
@@ -1514,16 +1741,26 @@ declare class MasterDetailComponent implements AfterViewInit {
1514
1741
  readonly emptyMessage: _angular_core.InputSignal<string>;
1515
1742
  readonly listLabel: _angular_core.InputSignal<string>;
1516
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>;
1517
1751
  readonly rowTemplate: _angular_core.Signal<TemplateRef<any>>;
1518
1752
  readonly detailTemplate: _angular_core.Signal<TemplateRef<any>>;
1519
1753
  readonly paginator: _angular_core.Signal<MatPaginator>;
1520
1754
  readonly uid: string;
1755
+ ngAfterContentInit(): void;
1521
1756
  ngAfterViewInit(): void;
1757
+ /** "X of Y" range text for the prevnext pagination style. */
1758
+ rangeText(): string;
1522
1759
  isSelected(row: any): boolean;
1523
1760
  optionId(index: number): string;
1524
1761
  onKeydown(event: KeyboardEvent, index: number): void;
1525
1762
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MasterDetailComponent, never>;
1526
- 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; }; }, {}, ["rowTemplate", "detailTemplate"], ["[mdHeader]", "[mdFilters]"], true, 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>;
1527
1764
  }
1528
1765
 
1529
1766
  interface FxMenuItem {
@@ -1557,6 +1794,385 @@ declare class MenuComponent {
1557
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>;
1558
1795
  }
1559
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>;
2174
+ }
2175
+
1560
2176
  declare class ConfirmationDialogComponent {
1561
2177
  private ref;
1562
2178
  bindings: any;
@@ -1585,9 +2201,9 @@ declare class ConfirmationDialogComponent {
1585
2201
  */
1586
2202
  declare class UiModule {
1587
2203
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiModule, never>;
1588
- 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 MeterComponent, typeof SectionCardComponent, typeof InfoFieldComponent, typeof SeverityBadgesComponent, typeof MasterDetailComponent, typeof MenuComponent, 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 MeterComponent, typeof SectionCardComponent, typeof InfoFieldComponent, typeof SeverityBadgesComponent, typeof MasterDetailComponent, typeof MenuComponent, typeof ConfirmationDialogComponent, typeof i1$1.FormsModule, typeof i1$1.ReactiveFormsModule, typeof i2.RouterModule, typeof HasPermissionDirective, typeof TrimOnBlurDirective]>;
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]>;
1589
2205
  static ɵinj: _angular_core.ɵɵInjectorDeclaration<UiModule>;
1590
2206
  }
1591
2207
 
1592
- export { AuthInterceptor, AuthStateService, BaseComponent, BaseDialogComponent, BaseMasterDetailComponent, BaseResolver, BaseTableComponent, BreadcrumbService, ButtonComponent, CheckboxComponent, CircleProgressBar, ConfirmationDialogComponent, DatetimePicker, DndUploadComponent, DrawerComponent, EmptyStateComponent, FX_ICON_SPRITE_URL, FilterChipsComponent, FxComponent, FxDialogService, FxLoadingService, FxStorageService, FxToastrService, FxUtils, FxValidators, HasPermissionDirective, HeroIconComponent, HttpLoaderFactory, HttpWrapper, InfoFieldComponent, InputComponent, KanbanBoardComponent, LoadingPanel, MasterDetailComponent, MenuComponent, MeterComponent, NotificationService, PermissionGuard, PermissionService, RadioButtonComponent, RadioButtonToggleComponent, RealtimeTableSync, 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 };
1593
- export type { Breadcrumb, ColumnChangedEvent, ErrorMessages, FxApiClass, FxConfirmOptions, FxFilterChipOption, FxListRequest, FxListResolverContext, FxMenuItem, FxSeverityBadge, FxStatCard, FxTableFilters, 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 };