@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
package/tokens.css CHANGED
@@ -3,16 +3,43 @@
3
3
  * Replaces the old JS preset (tailwind.config.js / lodash.merge sharing).
4
4
  *
5
5
  * Colour tokens point at the runtime RGB-triplet variables from theme.css
6
- * (dark default on :root, light via .light_theme) so theme switching keeps
7
- * working; opacity modifiers like bg-critical/10 are handled by v4's
8
- * color-mix() and need no <alpha-value> plumbing.
6
+ * (OgeniumDashboards --og-* per [data-og-theme] on <html>, porcelain default)
7
+ * so theme switching keeps working; opacity modifiers like bg-critical/10 are
8
+ * handled by v4's color-mix() and need no <alpha-value> plumbing.
9
9
  */
10
10
  /* `inline` is load-bearing: without it the rgb(var(--x)) values are baked
11
- into :root once, so .light_theme's runtime triplet overrides never reach
11
+ into :root once, so [data-og-theme]'s runtime triplet overrides never reach
12
12
  the utilities. inline makes every utility carry rgb(var(--x)) itself and
13
13
  resolve at the element that uses it — same behavior as v3. */
14
14
  @theme inline {
15
- /* Colours (names match the v3 preset so every existing class keeps working) */
15
+ /* ---- OG palette use these in new/restyled markup ---- */
16
+ --color-page: rgb(var(--og-page-bg));
17
+ --color-surface: rgb(var(--og-surface));
18
+ --color-surface-raised: rgb(var(--og-surface-raised));
19
+ --color-surface-sunken: rgb(var(--og-surface-sunken));
20
+ --color-border: rgb(var(--og-border));
21
+ --color-border-subtle: rgb(var(--og-border-subtle));
22
+ --color-strong: rgb(var(--og-text));
23
+ --color-body: rgb(var(--og-text-body));
24
+ --color-muted: rgb(var(--og-text-muted));
25
+ --color-faint: rgb(var(--og-text-faint));
26
+ --color-accent: rgb(var(--og-accent));
27
+ --color-accent-fg: rgb(var(--og-accent-fg));
28
+ --color-accent-contrast: rgb(var(--og-accent-contrast));
29
+ --color-accent-soft: rgb(var(--og-accent-soft-bg));
30
+ --color-accent-soft-fg: rgb(var(--og-accent-soft-fg));
31
+ --color-positive: rgb(var(--og-positive));
32
+ --color-positive-soft: rgb(var(--og-positive-soft-bg));
33
+ --color-negative: rgb(var(--og-negative));
34
+ --color-negative-soft: rgb(var(--og-negative-soft-bg));
35
+ --color-warning-soft: rgb(var(--og-warning-soft-bg));
36
+ --color-neutral-soft: rgb(var(--og-neutral-soft-bg));
37
+ --color-neutral-soft-fg: rgb(var(--og-neutral-soft-fg));
38
+ --color-track: rgb(var(--og-track));
39
+
40
+ /* ---- Legacy colour names (@deprecated — remove after the V2 campaign;
41
+ they resolve through the alias layer in theme.css, so every existing
42
+ class already renders the OG palette) ---- */
16
43
  --color-gradient-primary-start: rgb(var(--gradient-primary-start));
17
44
  --color-gradient-primary-end: rgb(var(--gradient-primary-end));
18
45
  --color-gradient-success-start: rgb(var(--gradient-success-start));
@@ -61,14 +88,22 @@
61
88
  --shadow-2xl: 0 25px 50px -12px rgb(var(--shadow-color) / 0.25);
62
89
  --inset-shadow-sm: inset 0 2px 4px 0 rgb(var(--shadow-color) / 0.05);
63
90
 
64
- /* v3 default border radii, incl. DEFAULT so bare `rounded` keeps working */
65
- --radius-sm: 0.125rem;
66
- --radius: 0.25rem;
67
- --radius-md: 0.375rem;
68
- --radius-lg: 0.5rem;
69
- --radius-xl: 0.75rem;
70
- --radius-2xl: 1rem;
71
- --radius-3xl: 1.5rem;
91
+ /* Radius is a THEME variable in V2 (blueprint/terminal are square, ivory
92
+ controls are pills) — never hardcode border-radius in components. */
93
+ --radius-frame: var(--og-radius-frame);
94
+ --radius-card: var(--og-radius-card);
95
+ --radius-control: var(--og-radius-control);
96
+ --radius-pill: var(--og-radius-pill);
97
+ /* Legacy fixed scale remapped onto the theme radii so blueprint/terminal go
98
+ square with zero template edits. `rounded-full` stays Tailwind-native
99
+ 9999px — avatars/dots must remain circular in every theme. */
100
+ --radius-sm: var(--og-radius-control);
101
+ --radius: var(--og-radius-control);
102
+ --radius-md: var(--og-radius-control);
103
+ --radius-lg: var(--og-radius-card);
104
+ --radius-xl: var(--og-radius-card);
105
+ --radius-2xl: var(--og-radius-card);
106
+ --radius-3xl: var(--og-radius-frame);
72
107
 
73
108
  /* Named spacing scale (gap-small, p-semi, mb-large, …) */
74
109
  --spacing-xs: 0.125rem;
@@ -79,12 +114,14 @@
79
114
  --spacing-xl: 1.25rem;
80
115
  --spacing-2xl: 1.5rem;
81
116
 
82
- /* Font families */
83
- --font-spmono: 'SpaceMonoRegular', monospace;
84
- --font-dmsans: 'DMSans', sans-serif;
85
- --font-orbitron: 'Orbitron', sans-serif;
86
- --font-bevn: 'BeVietnamPro', sans-serif;
87
- --font-roboto: 'Roboto', sans-serif;
117
+ /* Font families — theme variables (blueprint/terminal switch to mono).
118
+ V2 set: Archivo (body/display), JetBrains Mono / IBM Plex Mono (mono),
119
+ Source Serif 4 (prose), Newsreader (ivory/blueprint display). */
120
+ --font-body: var(--og-font-body);
121
+ --font-display: var(--og-font-display);
122
+ --font-mono: var(--og-font-mono);
123
+ --font-prose: var(--og-font-prose);
124
+ --font-figure: var(--og-font-figure);
88
125
 
89
126
  /* Font-size overrides (v3 preset values) */
90
127
  --text-xs: 0.75rem;
@@ -2,7 +2,7 @@ import * as _angular_core from '@angular/core';
2
2
  import { OnChanges, AfterViewInit, OnDestroy, ElementRef, ChangeDetectorRef } from '@angular/core';
3
3
  import { EChartsOption, ECharts } from 'echarts';
4
4
 
5
- type IChartType = 'bar' | 'pie' | 'sunburst' | 'auto';
5
+ type IChartType = 'bar' | 'pie' | 'sunburst' | 'line' | 'area-trend' | 'auto';
6
6
  declare class ChartComponent implements OnChanges, AfterViewInit, OnDestroy {
7
7
  private ref;
8
8
  private cdr;
@@ -15,7 +15,13 @@ declare class ChartComponent implements OnChanges, AfterViewInit, OnDestroy {
15
15
  readonly pieLegendAlign: _angular_core.InputSignal<string | number>;
16
16
  readonly pieLegendPosition: _angular_core.InputSignal<string | number>;
17
17
  readonly showPieLabel: _angular_core.InputSignal<boolean>;
18
+ /** Hide the built-in legend (panels that render their own legend beside the
19
+ donut); the donut then centres in the container. */
20
+ readonly showPieLegend: _angular_core.InputSignal<boolean>;
21
+ /** Caption under the donut's centre total (design: "42 / confirmed"). */
22
+ readonly pieCenterLabel: _angular_core.InputSignal<string>;
18
23
  readonly mobileWidth: _angular_core.InputSignal<number>;
24
+ /** Override font for canvas text; empty = follow the theme's --og-font-figure. */
19
25
  readonly labelFontFamily: _angular_core.InputSignal<string>;
20
26
  readonly emptyText: _angular_core.InputSignal<string>;
21
27
  readonly chartClick: _angular_core.OutputEmitterRef<any>;
@@ -44,9 +50,15 @@ declare class ChartComponent implements OnChanges, AfterViewInit, OnDestroy {
44
50
  private calcPieLayout;
45
51
  private detectType;
46
52
  private buildOptions;
53
+ private categoryAxis;
54
+ private valueAxis;
55
+ /** Canvas không ăn var() — resolve font stack thật tại render; chart đã
56
+ rebuild theo event theme-changed nên tự đổi font khi đổi theme
57
+ (blueprint/terminal dùng mono qua --og-font-figure). */
58
+ private resolvedFontFamily;
47
59
  private resolvePalette;
48
60
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ChartComponent, never>;
49
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ChartComponent, "fx-ui-chart", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "palette": { "alias": "palette"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "pieLegendAlign": { "alias": "pieLegendAlign"; "required": false; "isSignal": true; }; "pieLegendPosition": { "alias": "pieLegendPosition"; "required": false; "isSignal": true; }; "showPieLabel": { "alias": "showPieLabel"; "required": false; "isSignal": true; }; "mobileWidth": { "alias": "mobileWidth"; "required": false; "isSignal": true; }; "labelFontFamily": { "alias": "labelFontFamily"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; }, { "chartClick": "chartClick"; "chartInit": "chartInit"; }, never, never, true, never>;
61
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ChartComponent, "fx-ui-chart", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "palette": { "alias": "palette"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "pieLegendAlign": { "alias": "pieLegendAlign"; "required": false; "isSignal": true; }; "pieLegendPosition": { "alias": "pieLegendPosition"; "required": false; "isSignal": true; }; "showPieLabel": { "alias": "showPieLabel"; "required": false; "isSignal": true; }; "showPieLegend": { "alias": "showPieLegend"; "required": false; "isSignal": true; }; "pieCenterLabel": { "alias": "pieCenterLabel"; "required": false; "isSignal": true; }; "mobileWidth": { "alias": "mobileWidth"; "required": false; "isSignal": true; }; "labelFontFamily": { "alias": "labelFontFamily"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; }, { "chartClick": "chartClick"; "chartInit": "chartInit"; }, never, never, true, never>;
50
62
  }
51
63
 
52
64
  export { ChartComponent };
@@ -1,6 +1,87 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { Node, Edge, Connection } from 'ngx-vflow';
3
3
 
4
+ /**
5
+ * What a chain node represents. Structural kinds (`entry`, `convergence`,
6
+ * `impact`, `stage`) can be derived from the graph itself; the validation kinds
7
+ * (`mitigation`, `review`, `not-reproduced`) come from an analyst verdict.
8
+ */
9
+ type FxChainNodeKind = 'entry' | 'convergence' | 'mitigation' | 'review' | 'not-reproduced' | 'impact' | 'stage';
10
+ interface FxChainNode {
11
+ id: string;
12
+ /** Node title — rendered in the figure/mono face. */
13
+ label: string;
14
+ kind: FxChainNodeKind;
15
+ /** Caller-translated kind eyebrow; falls back to the raw kind key. */
16
+ kindLabel?: string;
17
+ /** Caller-translated muted subtitle. */
18
+ caption?: string;
19
+ /** true = verified badge, false = unverified badge, null/undefined = no badge. */
20
+ verified?: boolean | null;
21
+ /** Explicit column (0 = leftmost); omit to derive depth from the edges. */
22
+ column?: number;
23
+ /** Explicit row inside the column; omit to stack in declaration order. */
24
+ row?: number;
25
+ }
26
+ interface FxChainEdge {
27
+ source: string;
28
+ target: string;
29
+ }
30
+ /** Kind → severity token. Exported so callers can tint matching chips (the
31
+ stage list beside the canvas) from the same source of truth. */
32
+ declare const FX_CHAIN_KIND_TONE: Record<FxChainNodeKind, string>;
33
+ /**
34
+ * V2 exploit-chain canvas — the attack-path graph of design refs 04..07:
35
+ * kind-tinted node cards laid out left→right, curved edges, draggable nodes on
36
+ * a pannable/zoomable surface.
37
+ *
38
+ * Presentational: it takes a graph plus the currently selected node and emits
39
+ * clicks. Layout is derived from the edges (longest path from a source) unless
40
+ * a node pins its own column/row, so callers can hand over a plain chain.
41
+ *
42
+ * <fx-ui-flow-canvas [nodes]="chainNodes" [edges]="chainEdges"
43
+ * [activeId]="stageId()" (nodeClick)="selectStage($event)" />
44
+ */
45
+ declare class FlowCanvasComponent {
46
+ readonly nodes: _angular_core.InputSignal<FxChainNode[]>;
47
+ readonly edges: _angular_core.InputSignal<FxChainEdge[]>;
48
+ /** Selected/current node: full opacity + accent border; the rest dim. */
49
+ readonly activeId: _angular_core.InputSignal<string | null>;
50
+ /** Explicit canvas height; omit to size it from the number of stacked rows. */
51
+ readonly height: _angular_core.InputSignal<string>;
52
+ /** Caller-translated hint shown when the graph is empty. */
53
+ readonly emptyText: _angular_core.InputSignal<string>;
54
+ readonly nodeClick: _angular_core.OutputEmitterRef<string>;
55
+ /** Column index per node: pinned value, else longest path from a source. */
56
+ private readonly columns;
57
+ /** ngx-vflow nodes: html-template cards positioned by the derived layout. */
58
+ readonly flowNodes: _angular_core.Signal<Node[]>;
59
+ /**
60
+ * Edges stay identity-stable across selections: state lives in the template
61
+ * (read off `activeId`), so selecting a stage never re-creates them.
62
+ */
63
+ readonly flowEdges: _angular_core.Signal<Edge<unknown>[]>;
64
+ /** Nodes one hop from the selection — they stay lit alongside it. */
65
+ private readonly relatedIds;
66
+ readonly isEmpty: _angular_core.Signal<boolean>;
67
+ /**
68
+ * A linear chain needs one row, the design's converging entries need three —
69
+ * sizing from the layout keeps the card from leaving a tall empty band.
70
+ */
71
+ readonly resolvedHeight: _angular_core.Signal<string>;
72
+ kindTone(kind: FxChainNodeKind): string;
73
+ isActive(node: FxChainNode): boolean;
74
+ /** One hop from the selection: lit, but without the selected accent frame. */
75
+ isRelated(node: FxChainNode): boolean;
76
+ /** Nothing selected → every node reads at full strength. */
77
+ isDimmed(node: FxChainNode): boolean;
78
+ /** An edge touching the selection is part of the step being read. */
79
+ isEdgeActive(edge: Edge): boolean;
80
+ isEdgeDimmed(edge: Edge): boolean;
81
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlowCanvasComponent, never>;
82
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlowCanvasComponent, "fx-ui-flow-canvas", never, { "nodes": { "alias": "nodes"; "required": false; "isSignal": true; }; "edges": { "alias": "edges"; "required": false; "isSignal": true; }; "activeId": { "alias": "activeId"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; }, { "nodeClick": "nodeClick"; }, never, never, true, never>;
83
+ }
84
+
4
85
  declare class FlowConnection {
5
86
  readonly nodes: _angular_core.InputSignal<Node[]>;
6
87
  edges: Edge[];
@@ -11,4 +92,5 @@ declare class FlowConnection {
11
92
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlowConnection, "fx-ui-flow-connection", never, { "nodes": { "alias": "nodes"; "required": false; "isSignal": true; }; "edges": { "alias": "edges"; "required": false; }; "backgroundColor": { "alias": "backgroundColor"; "required": false; "isSignal": true; }; "view": { "alias": "view"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
12
93
  }
13
94
 
14
- export { FlowConnection };
95
+ export { FX_CHAIN_KIND_TONE, FlowCanvasComponent, FlowConnection };
96
+ export type { FxChainEdge, FxChainNode, FxChainNodeKind };