@foxeltech/angular-ui 0.4.0 → 0.7.75

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 (189) 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 +332 -30
  14. package/dialogs.css +2 -2
  15. package/familjen-grotesk/familjen-grotesk-400-latin-ext.woff2 +0 -0
  16. package/familjen-grotesk/familjen-grotesk-400-latin.woff2 +0 -0
  17. package/familjen-grotesk/familjen-grotesk-400-vietnamese.woff2 +0 -0
  18. package/familjen-grotesk/familjen-grotesk-500-latin-ext.woff2 +0 -0
  19. package/familjen-grotesk/familjen-grotesk-500-latin.woff2 +0 -0
  20. package/familjen-grotesk/familjen-grotesk-500-vietnamese.woff2 +0 -0
  21. package/familjen-grotesk/familjen-grotesk-600-latin-ext.woff2 +0 -0
  22. package/familjen-grotesk/familjen-grotesk-600-latin.woff2 +0 -0
  23. package/familjen-grotesk/familjen-grotesk-600-vietnamese.woff2 +0 -0
  24. package/familjen-grotesk/familjen-grotesk-700-latin-ext.woff2 +0 -0
  25. package/familjen-grotesk/familjen-grotesk-700-latin.woff2 +0 -0
  26. package/familjen-grotesk/familjen-grotesk-700-vietnamese.woff2 +0 -0
  27. package/fesm2022/foxeltech-angular-ui-chart.mjs +381 -40
  28. package/fesm2022/foxeltech-angular-ui-chart.mjs.map +1 -1
  29. package/fesm2022/foxeltech-angular-ui-flow.mjs +176 -3
  30. package/fesm2022/foxeltech-angular-ui-flow.mjs.map +1 -1
  31. package/fesm2022/foxeltech-angular-ui-rich-text.mjs +2 -2
  32. package/fesm2022/foxeltech-angular-ui-rich-text.mjs.map +1 -1
  33. package/fesm2022/foxeltech-angular-ui.mjs +1327 -151
  34. package/fesm2022/foxeltech-angular-ui.mjs.map +1 -1
  35. package/fonts.css +558 -133
  36. package/ibm-plex-mono/ibm-plex-mono-400-cyrillic-ext.woff2 +0 -0
  37. package/ibm-plex-mono/ibm-plex-mono-400-cyrillic.woff2 +0 -0
  38. package/ibm-plex-mono/ibm-plex-mono-400-latin-ext.woff2 +0 -0
  39. package/ibm-plex-mono/ibm-plex-mono-400-latin.woff2 +0 -0
  40. package/ibm-plex-mono/ibm-plex-mono-400-vietnamese.woff2 +0 -0
  41. package/ibm-plex-mono/ibm-plex-mono-500-cyrillic-ext.woff2 +0 -0
  42. package/ibm-plex-mono/ibm-plex-mono-500-cyrillic.woff2 +0 -0
  43. package/ibm-plex-mono/ibm-plex-mono-500-latin-ext.woff2 +0 -0
  44. package/ibm-plex-mono/ibm-plex-mono-500-latin.woff2 +0 -0
  45. package/ibm-plex-mono/ibm-plex-mono-500-vietnamese.woff2 +0 -0
  46. package/ibm-plex-mono/ibm-plex-mono-600-cyrillic-ext.woff2 +0 -0
  47. package/ibm-plex-mono/ibm-plex-mono-600-cyrillic.woff2 +0 -0
  48. package/ibm-plex-mono/ibm-plex-mono-600-latin-ext.woff2 +0 -0
  49. package/ibm-plex-mono/ibm-plex-mono-600-latin.woff2 +0 -0
  50. package/ibm-plex-mono/ibm-plex-mono-600-vietnamese.woff2 +0 -0
  51. package/jetbrains-mono/jetbrains-mono-400-cyrillic-ext.woff2 +0 -0
  52. package/jetbrains-mono/jetbrains-mono-400-cyrillic.woff2 +0 -0
  53. package/jetbrains-mono/jetbrains-mono-400-greek.woff2 +0 -0
  54. package/jetbrains-mono/jetbrains-mono-400-latin-ext.woff2 +0 -0
  55. package/jetbrains-mono/jetbrains-mono-400-latin.woff2 +0 -0
  56. package/jetbrains-mono/jetbrains-mono-400-vietnamese.woff2 +0 -0
  57. package/jetbrains-mono/jetbrains-mono-500-cyrillic-ext.woff2 +0 -0
  58. package/jetbrains-mono/jetbrains-mono-500-cyrillic.woff2 +0 -0
  59. package/jetbrains-mono/jetbrains-mono-500-greek.woff2 +0 -0
  60. package/jetbrains-mono/jetbrains-mono-500-latin-ext.woff2 +0 -0
  61. package/jetbrains-mono/jetbrains-mono-500-latin.woff2 +0 -0
  62. package/jetbrains-mono/jetbrains-mono-500-vietnamese.woff2 +0 -0
  63. package/jetbrains-mono/jetbrains-mono-600-cyrillic-ext.woff2 +0 -0
  64. package/jetbrains-mono/jetbrains-mono-600-cyrillic.woff2 +0 -0
  65. package/jetbrains-mono/jetbrains-mono-600-greek.woff2 +0 -0
  66. package/jetbrains-mono/jetbrains-mono-600-latin-ext.woff2 +0 -0
  67. package/jetbrains-mono/jetbrains-mono-600-latin.woff2 +0 -0
  68. package/jetbrains-mono/jetbrains-mono-600-vietnamese.woff2 +0 -0
  69. package/jetbrains-mono/jetbrains-mono-700-cyrillic-ext.woff2 +0 -0
  70. package/jetbrains-mono/jetbrains-mono-700-cyrillic.woff2 +0 -0
  71. package/jetbrains-mono/jetbrains-mono-700-greek.woff2 +0 -0
  72. package/jetbrains-mono/jetbrains-mono-700-latin-ext.woff2 +0 -0
  73. package/jetbrains-mono/jetbrains-mono-700-latin.woff2 +0 -0
  74. package/jetbrains-mono/jetbrains-mono-700-vietnamese.woff2 +0 -0
  75. package/newsreader/newsreader-400-latin-ext.woff2 +0 -0
  76. package/newsreader/newsreader-400-latin.woff2 +0 -0
  77. package/newsreader/newsreader-400-vietnamese.woff2 +0 -0
  78. package/newsreader/newsreader-500-latin-ext.woff2 +0 -0
  79. package/newsreader/newsreader-500-latin.woff2 +0 -0
  80. package/newsreader/newsreader-500-vietnamese.woff2 +0 -0
  81. package/newsreader/newsreader-600-latin-ext.woff2 +0 -0
  82. package/newsreader/newsreader-600-latin.woff2 +0 -0
  83. package/newsreader/newsreader-600-vietnamese.woff2 +0 -0
  84. package/package.json +5 -2
  85. package/source-serif-4/source-serif-4-400-cyrillic-ext.woff2 +0 -0
  86. package/source-serif-4/source-serif-4-400-cyrillic.woff2 +0 -0
  87. package/source-serif-4/source-serif-4-400-greek.woff2 +0 -0
  88. package/source-serif-4/source-serif-4-400-latin-ext.woff2 +0 -0
  89. package/source-serif-4/source-serif-4-400-latin.woff2 +0 -0
  90. package/source-serif-4/source-serif-4-400-vietnamese.woff2 +0 -0
  91. package/source-serif-4/source-serif-4-600-cyrillic-ext.woff2 +0 -0
  92. package/source-serif-4/source-serif-4-600-cyrillic.woff2 +0 -0
  93. package/source-serif-4/source-serif-4-600-greek.woff2 +0 -0
  94. package/source-serif-4/source-serif-4-600-latin-ext.woff2 +0 -0
  95. package/source-serif-4/source-serif-4-600-latin.woff2 +0 -0
  96. package/source-serif-4/source-serif-4-600-vietnamese.woff2 +0 -0
  97. package/src/lib/styles/components.css +332 -30
  98. package/src/lib/styles/dialogs.css +2 -2
  99. package/src/lib/styles/fonts.css +558 -133
  100. package/src/lib/styles/tailwind.css +13 -1
  101. package/src/lib/styles/theme.css +642 -69
  102. package/src/lib/styles/tokens.css +81 -19
  103. package/src/lib/styles/utilities.css +16 -1
  104. package/src/lib/ui/components/bar-list/bar-list.component.html +29 -0
  105. package/src/lib/ui/components/button/button.component.html +9 -5
  106. package/src/lib/ui/components/checkbox/checkbox.component.html +1 -1
  107. package/src/lib/ui/components/code-block/code-block.component.html +8 -0
  108. package/src/lib/ui/components/drawer/drawer.component.html +35 -12
  109. package/src/lib/ui/components/drawer/drawer.component.scss +106 -18
  110. package/src/lib/ui/components/facets-rail/facets-rail.component.html +37 -0
  111. package/src/lib/ui/components/filter-pills/filter-pills.component.html +16 -0
  112. package/src/lib/ui/components/kanban-board/kanban-board.component.scss +9 -9
  113. package/src/lib/ui/components/list-row/list-row.component.html +20 -0
  114. package/src/lib/ui/components/master-detail/master-detail.component.css +79 -5
  115. package/src/lib/ui/components/master-detail/master-detail.component.html +57 -7
  116. package/src/lib/ui/components/pending-badge/pending-badge.component.html +15 -0
  117. package/src/lib/ui/components/pipeline-stepper/pipeline-stepper.component.html +45 -0
  118. package/src/lib/ui/components/project-card/project-card.component.html +102 -0
  119. package/src/lib/ui/components/radio-button/radio-button.component.html +1 -1
  120. package/src/lib/ui/components/radio-button-toggle/radio-button-toggle.component.html +1 -1
  121. package/src/lib/ui/components/route-skeleton/route-skeleton.component.css +38 -0
  122. package/src/lib/ui/components/route-skeleton/route-skeleton.component.html +184 -0
  123. package/src/lib/ui/components/sample-frame/sample-frame.component.html +18 -0
  124. package/src/lib/ui/components/score-badge/score-badge.component.html +7 -0
  125. package/src/lib/ui/components/screenshot-frame/screenshot-frame.component.html +40 -0
  126. package/src/lib/ui/components/section-card/section-card.component.html +15 -6
  127. package/src/lib/ui/components/segmented/segmented.component.html +42 -0
  128. package/src/lib/ui/components/segmented/segmented.component.scss +12 -0
  129. package/src/lib/ui/components/skeleton-dashboard/skeleton-dashboard.component.html +24 -0
  130. package/src/lib/ui/components/skeleton-detail/skeleton-detail.component.html +8 -8
  131. package/src/lib/ui/components/skeleton-facets/skeleton-facets.component.html +15 -0
  132. package/src/lib/ui/components/skeleton-frame/skeleton-frame.component.html +59 -0
  133. package/src/lib/ui/components/skeleton-list/skeleton-list.component.html +6 -6
  134. package/src/lib/ui/components/slider/slider.component.html +2 -2
  135. package/src/lib/ui/components/sparkbar/sparkbar.component.html +14 -0
  136. package/src/lib/ui/components/stage-dots/stage-dots.component.html +13 -0
  137. package/src/lib/ui/components/stat-cards/stat-cards.component.html +44 -11
  138. package/src/lib/ui/components/status-dot/status-dot.component.html +13 -0
  139. package/src/lib/ui/components/switch/switch.component.html +1 -1
  140. package/src/lib/ui/components/tab-group/tab-group.component.html +37 -8
  141. package/src/lib/ui/components/tab-group/tab-group.component.scss +41 -1
  142. package/src/lib/ui/components/tag/tag.component.html +2 -2
  143. package/src/lib/ui/components/theme-picker/theme-picker.component.html +44 -0
  144. package/src/lib/ui/components/toast/toast.component.html +6 -6
  145. package/src/lib/ui/components/tree-diagram/tree-diagram.component.html +3 -3
  146. package/tailwind.css +13 -1
  147. package/theme.css +642 -69
  148. package/tokens.css +81 -19
  149. package/types/foxeltech-angular-ui-chart.d.ts +90 -3
  150. package/types/foxeltech-angular-ui-flow.d.ts +83 -1
  151. package/types/foxeltech-angular-ui.d.ts +909 -48
  152. package/utilities.css +16 -1
  153. package/BeVietnamPro/BeVietnamPro-Bold.woff2 +0 -0
  154. package/BeVietnamPro/BeVietnamPro-ExtraLight.woff2 +0 -0
  155. package/BeVietnamPro/BeVietnamPro-Light.woff2 +0 -0
  156. package/BeVietnamPro/BeVietnamPro-Medium.woff2 +0 -0
  157. package/BeVietnamPro/BeVietnamPro-Regular.woff2 +0 -0
  158. package/BeVietnamPro/BeVietnamPro-SemiBold.woff2 +0 -0
  159. package/BeVietnamPro/BeVietnamPro-Thin.woff2 +0 -0
  160. package/SpaceMono-Regular.woff2 +0 -0
  161. package/dm-sans/DMSans-Bold.woff2 +0 -0
  162. package/dm-sans/DMSans-Light.woff2 +0 -0
  163. package/dm-sans/DMSans-Medium.woff2 +0 -0
  164. package/dm-sans/DMSans-Regular.woff2 +0 -0
  165. package/dm-sans/DMSans-SemiBold.woff2 +0 -0
  166. package/dm-sans/DMSans-Thin.woff2 +0 -0
  167. package/orbitron/Orbitron-Bold.woff2 +0 -0
  168. package/orbitron/Orbitron-Medium.woff2 +0 -0
  169. package/orbitron/Orbitron-Regular.woff2 +0 -0
  170. package/orbitron/Orbitron-SemiBold.woff2 +0 -0
  171. package/roboto/Roboto-Black.woff2 +0 -0
  172. package/roboto/Roboto-BlackItalic.woff2 +0 -0
  173. package/roboto/Roboto-Bold.woff2 +0 -0
  174. package/roboto/Roboto-BoldCondensed.woff2 +0 -0
  175. package/roboto/Roboto-BoldCondensedItalic.woff2 +0 -0
  176. package/roboto/Roboto-BoldItalic.woff2 +0 -0
  177. package/roboto/Roboto-Condensed.woff2 +0 -0
  178. package/roboto/Roboto-CondensedItalic.woff2 +0 -0
  179. package/roboto/Roboto-Italic.woff2 +0 -0
  180. package/roboto/Roboto-Light.woff2 +0 -0
  181. package/roboto/Roboto-LightItalic.woff2 +0 -0
  182. package/roboto/Roboto-Medium.woff2 +0 -0
  183. package/roboto/Roboto-MediumItalic.woff2 +0 -0
  184. package/roboto/Roboto-Regular.woff2 +0 -0
  185. package/roboto/Roboto-Thin.woff2 +0 -0
  186. package/roboto/Roboto-ThinItalic.woff2 +0 -0
  187. package/src/lib/ui/components/skeleton-table-loading/skeleton-table-loading.component.html +0 -21
  188. package/src/lib/ui/components/skeleton-table-loading/skeleton-table-loading.component.scss +0 -0
  189. package/src/lib/ui/components/tab-component/tab.component.html +0 -1
Binary file
Binary file
Binary file
Binary file
package/components.css CHANGED
@@ -77,7 +77,7 @@
77
77
  margin-right: 0px !important;
78
78
  }
79
79
  .mat-mdc-tooltip {
80
- border-radius: 6px !important;
80
+ border-radius: var(--og-radius-control) !important;
81
81
  background-color: rgb(var(--bg-primary)) !important;
82
82
  --mdc-plain-tooltip-container-color: rgb(var(--bg-primary));
83
83
  --mdc-plain-tooltip-supporting-text-color: rgb(var(--text-primary));
@@ -88,7 +88,7 @@
88
88
 
89
89
  .mat-mdc-table {
90
90
  border: 1px solid rgb(var(--border-default)) !important;
91
- border-radius: 12px !important;
91
+ border-radius: var(--og-radius-card) !important;
92
92
  overflow: hidden !important;
93
93
  border-collapse: separate !important;
94
94
  border-spacing: 0 !important;
@@ -106,7 +106,7 @@
106
106
  padding-top: 8px !important;
107
107
  padding-bottom: 8px !important;
108
108
  line-height: 24px !important;
109
- font-family: 'Roboto';
109
+ font-family: var(--og-font-body);
110
110
  }
111
111
 
112
112
  .mdc-data-table__row {
@@ -122,7 +122,7 @@
122
122
  .mdc-data-table__cell {
123
123
  border-bottom: 1px solid rgb(var(--border-default)) !important;
124
124
  background-color: rgb(var(--bg-primary)) !important;
125
- font-family: 'Roboto';
125
+ font-family: var(--og-font-body);
126
126
  }
127
127
 
128
128
  .mat-mdc-row:last-child .mdc-data-table__cell {
@@ -136,7 +136,7 @@
136
136
  .mat-mdc-select-panel {
137
137
  background-color: rgb(var(--bg-primary)) !important;
138
138
  border: 1px solid rgb(var(--border-default)) !important;
139
- border-radius: 0.5rem !important;
139
+ border-radius: var(--og-radius-card) !important;
140
140
  box-shadow: 0 2px 4px rgb(var(--shadow-color) / 0.1) !important;
141
141
  }
142
142
 
@@ -145,11 +145,11 @@
145
145
  }
146
146
 
147
147
  .mat-mdc-menu-panel {
148
- border-radius: 6px !important;
148
+ border-radius: var(--og-radius-card) !important;
149
149
  border-color: rgb(var(--border-default)) !important;
150
150
  }
151
151
  .mat-mdc-menu-panel .mat-mdc-menu-content {
152
- @apply bg-bg-primary shadow-none border rounded-[6px] border-border-default flex flex-col;
152
+ @apply bg-bg-primary shadow-none border rounded-card border-border-default flex flex-col;
153
153
  }
154
154
 
155
155
  .mat-mdc-option .mat-pseudo-checkbox {
@@ -158,7 +158,7 @@
158
158
 
159
159
  .mat-mdc-dialog-surface {
160
160
  background-color: rgb(var(--bg-primary)) !important;
161
- border-radius: 8px !important;
161
+ border-radius: var(--og-radius-card) !important;
162
162
  }
163
163
  .mat-mdc-dialog-container .mat-mdc-dialog-content {
164
164
  letter-spacing: 0 !important;
@@ -203,7 +203,7 @@ input[type='password'] {
203
203
  @apply font-semibold text-sm tracking-normal leading-5 text-text-primary;
204
204
  }
205
205
  .txt-heading-table {
206
- @apply text-base font-roboto font-semibold text-text-primary tracking-tight;
206
+ @apply text-base font-body font-semibold text-text-primary tracking-tight;
207
207
  }
208
208
  .txt-heading-compact-02 {
209
209
  @apply font-semibold text-sm tracking-normal leading-5 text-text-primary;
@@ -299,23 +299,35 @@ input[type='password'] {
299
299
  .txt-tag-default {
300
300
  @apply txt-tag-common text-text-secondary;
301
301
  }
302
+ /* ---- fx-ui-tag: tông theo hệ MỚI ------------------------------------
303
+ `fx-ui-tag` là tag DÙNG CHUNG (priority, status, category…), không phải
304
+ badge severity đứng một mình — nên nền mềm theo THANG ĐO (`--og-sev-*` pha
305
+ loãng), KHÔNG dùng pill đen đặc của `.tone-tint-critical`. Trước đây trỏ
306
+ vào bộ LEGACY vivid (`bg-critical/20` → hồng #fe0453) nên mọi badge trong
307
+ list ở mọi tab vẫn ra màu cũ (anh Tú báo 03/09). */
302
308
  .txt-tag-success {
303
- @apply txt-tag-common text-success;
309
+ @apply txt-tag-common;
310
+ color: rgb(var(--og-positive));
304
311
  }
305
312
  .txt-tag-warning {
306
- @apply txt-tag-common text-warning;
313
+ @apply txt-tag-common;
314
+ color: rgb(var(--og-warning));
307
315
  }
308
316
  .txt-tag-critical {
309
- @apply txt-tag-common text-critical;
317
+ @apply txt-tag-common;
318
+ color: rgb(var(--og-sev-critical));
310
319
  }
311
320
  .txt-tag-danger {
312
- @apply txt-tag-common text-danger;
321
+ @apply txt-tag-common;
322
+ color: rgb(var(--og-sev-danger));
313
323
  }
314
324
  .txt-tag-information {
315
- @apply txt-tag-common text-information;
325
+ @apply txt-tag-common;
326
+ color: rgb(var(--og-neutral-soft-fg));
316
327
  }
317
328
  .txt-tag-discovery {
318
- @apply txt-tag-common text-discovery;
329
+ @apply txt-tag-common;
330
+ color: rgb(var(--og-accent-soft-fg));
319
331
  }
320
332
  .txt-link {
321
333
  @apply font-semibold text-text-link text-sm tracking-normal;
@@ -334,7 +346,268 @@ input[type='password'] {
334
346
  @apply btn-common bg-gradient-primary hover:opacity-75 text-text-focus;
335
347
  }
336
348
  .btn-success {
337
- @apply btn-common bg-gradient-success hover:opacity-75 text-white;
349
+ @apply btn-common bg-gradient-success hover:opacity-75 text-surface;
350
+ }
351
+ /* Nút hành động chính theo demo (`.bi-newbtn`): màu cố định, không phải accent. */
352
+ /* ---- Tông severity theo ĐÚNG mô hình demo (đo 03/09) -----------------
353
+ Demo KHÔNG tô badge bằng màu rực. Nó dùng token semantic, và bậc nặng
354
+ nhất được nhấn bằng ĐỘ ĐẬM chứ không bằng màu:
355
+ Critical → nền --og-text (#26282c), chữ --og-surface (pill đen đặc)
356
+ High → nền --og-negative-soft-bg, chữ --og-negative
357
+ Medium → nền --og-warning-soft-bg, chữ --og-warning
358
+ Low → nền --og-positive-soft-bg, chữ --og-positive
359
+ Info → nền --og-neutral-soft-bg, chữ --og-neutral-soft-fg
360
+ Neutral → nền --og-surface-sunken, chữ --og-text-muted
361
+
362
+ Dùng class thay vì utility Tailwind vì tên `warning`/`critical` trong theme
363
+ Tailwind đang trỏ vào bộ LEGACY `--og-tone-*`, không phải token semantic —
364
+ gọi `text-warning` ở đây sẽ lấy sai màu.
365
+
366
+ MÀU (`tone-tint-*`) tách khỏi HÌNH DẠNG (`tone-badge`) có chủ đích: ô icon
367
+ vuông của stat-card và chip filter cần đúng màu nhưng KHÔNG được nhận
368
+ `border-radius:999px` + padding của pill. */
369
+ /* ---- Tông THANG ĐO cho filter chip -----------------------------------
370
+ Filter chip severity là một THANG ĐO (giống chấm legend), không phải badge
371
+ của một finding — nên KHÔNG dùng `.tone-tint-critical` (pill đen đặc, dành
372
+ riêng cho badge Critical theo `.og-badge--solid`). Ở đây Critical phải đọc
373
+ ra ĐỎ SẪM: nền mềm pha từ ramp `--og-sev-*`, chữ lấy bản dễ đọc nhất.
374
+ (Demo không có mẫu để copy: filter chip của demo theo TRẠNG THÁI —
375
+ "Confirmed / Reachable / Blocked" — chứ không theo severity.) */
376
+ .tone-scale-critical {
377
+ background: color-mix(in srgb, rgb(var(--og-sev-critical)) 12%, rgb(var(--og-surface)));
378
+ color: rgb(var(--og-sev-critical));
379
+ }
380
+ .tone-scale-danger {
381
+ background: color-mix(in srgb, rgb(var(--og-sev-danger)) 12%, rgb(var(--og-surface)));
382
+ color: rgb(var(--og-sev-danger));
383
+ }
384
+ .tone-scale-warning {
385
+ background: color-mix(in srgb, rgb(var(--og-sev-warning)) 16%, rgb(var(--og-surface)));
386
+ color: rgb(var(--og-warning));
387
+ }
388
+ .tone-scale-success {
389
+ background: color-mix(in srgb, rgb(var(--og-sev-success)) 12%, rgb(var(--og-surface)));
390
+ color: rgb(var(--og-positive));
391
+ }
392
+ .tone-scale-information {
393
+ background: rgb(var(--og-neutral-soft-bg));
394
+ color: rgb(var(--og-neutral-soft-fg));
395
+ }
396
+ .tone-scale-discovery {
397
+ background: rgb(var(--og-accent-soft-bg));
398
+ color: rgb(var(--og-accent-soft-fg));
399
+ }
400
+ .tone-scale-neutral {
401
+ background: rgb(var(--og-surface-sunken));
402
+ color: rgb(var(--og-text-muted));
403
+ }
404
+ /* ---- Nền ĐẶC theo tông ------------------------------------------------
405
+ Cho trạng thái ĐANG CHỌN (chip filter active) — nơi cần khối màu đậm kèm
406
+ chữ tương phản. Khác `.tone-tint-*`: cái đó là bộ badge severity theo demo
407
+ (Critical = đen), còn đây là màu của chính bậc severity. */
408
+ .tone-solid-critical {
409
+ background: rgb(var(--og-sev-critical));
410
+ color: rgb(var(--og-surface));
411
+ }
412
+ .tone-solid-danger {
413
+ background: rgb(var(--og-sev-danger));
414
+ color: rgb(var(--og-surface));
415
+ }
416
+ .tone-solid-warning {
417
+ background: rgb(var(--og-warning));
418
+ color: rgb(var(--og-surface));
419
+ }
420
+ .tone-solid-success {
421
+ background: rgb(var(--og-positive));
422
+ color: rgb(var(--og-surface));
423
+ }
424
+ .tone-solid-information {
425
+ background: rgb(var(--og-neutral-soft-fg));
426
+ color: rgb(var(--og-surface));
427
+ }
428
+ .tone-solid-discovery {
429
+ background: rgb(var(--og-accent));
430
+ color: rgb(var(--og-surface));
431
+ }
432
+ .tone-solid-neutral {
433
+ background: rgb(var(--og-text-faint));
434
+ color: rgb(var(--og-surface));
435
+ }
436
+
437
+ /* ---- Viền theo tông ---------------------------------------------------
438
+ Tách riêng vì `border-color` là thuộc tính khác: panel trạng thái (dropzone
439
+ upload) cần viền + nền + chữ cùng tông. `tone-hover-border-*` cho chỗ chỉ
440
+ đổi viền khi hover (KPI card) — modifier `hover:` của Tailwind không áp
441
+ được lên class CSS thật nên khai thẳng pseudo-class. */
442
+ .tone-border-critical {
443
+ border-color: rgb(var(--og-sev-critical));
444
+ }
445
+ .tone-border-danger {
446
+ border-color: rgb(var(--og-sev-danger));
447
+ }
448
+ .tone-border-warning {
449
+ border-color: rgb(var(--og-warning));
450
+ }
451
+ .tone-border-success {
452
+ border-color: rgb(var(--og-positive));
453
+ }
454
+ .tone-border-information {
455
+ border-color: rgb(var(--og-neutral-soft-fg));
456
+ }
457
+ .tone-border-discovery {
458
+ border-color: rgb(var(--og-accent));
459
+ }
460
+ .tone-border-neutral {
461
+ border-color: rgb(var(--og-border));
462
+ }
463
+ .tone-hover-border-critical:hover {
464
+ border-color: rgb(var(--og-sev-critical));
465
+ }
466
+ .tone-hover-border-danger:hover {
467
+ border-color: rgb(var(--og-sev-danger));
468
+ }
469
+ .tone-hover-border-warning:hover {
470
+ border-color: rgb(var(--og-warning));
471
+ }
472
+ .tone-hover-border-success:hover {
473
+ border-color: rgb(var(--og-positive));
474
+ }
475
+ .tone-hover-border-information:hover {
476
+ border-color: rgb(var(--og-neutral-soft-fg));
477
+ }
478
+ .tone-hover-border-discovery:hover {
479
+ border-color: rgb(var(--og-accent));
480
+ }
481
+ .tone-hover-border-neutral:hover {
482
+ border-color: rgb(var(--og-border));
483
+ }
484
+
485
+ .tone-tint-critical {
486
+ background: rgb(var(--og-text));
487
+ color: rgb(var(--og-surface));
488
+ }
489
+ .tone-tint-danger {
490
+ background: rgb(var(--og-negative-soft-bg));
491
+ color: rgb(var(--og-negative));
492
+ }
493
+ .tone-tint-warning {
494
+ background: rgb(var(--og-warning-soft-bg));
495
+ color: rgb(var(--og-warning));
496
+ }
497
+ .tone-tint-success {
498
+ background: rgb(var(--og-positive-soft-bg));
499
+ color: rgb(var(--og-positive));
500
+ }
501
+ .tone-tint-information {
502
+ background: rgb(var(--og-neutral-soft-bg));
503
+ color: rgb(var(--og-neutral-soft-fg));
504
+ }
505
+ .tone-tint-discovery {
506
+ /* demo: `.og-badge--accent` */
507
+ background: rgb(var(--og-accent-soft-bg));
508
+ color: rgb(var(--og-accent-soft-fg));
509
+ }
510
+ .tone-tint-neutral {
511
+ background: rgb(var(--og-surface-sunken));
512
+ color: rgb(var(--og-text-muted));
513
+ }
514
+
515
+ /* ---- Chữ / chấm theo tông (tầng 3 của mô hình demo) -----------------
516
+ Demo tách RÕ ba tầng (nguồn: `sevMeta` + `.og-badge--*` + `.og-statusdot--*`):
517
+ ① chart → màu literal `--og-sev-*`
518
+ ② badge/pill → `.tone-tint-*` (token semantic, Critical = solid)
519
+ ③ chữ & chấm → màu SEMANTIC, không phải ramp chart
520
+
521
+ `.tone-fg-*` chọn thành viên DỄ ĐỌC NHẤT trong mỗi họ severity (contrast
522
+ trên surface trắng): critical #7f1d1d 10.0:1 · danger #dc2626 4.83:1 ·
523
+ warning --og-warning #a8741f 4.0:1 (ramp #f59e0b chỉ 2.15:1 → không dùng
524
+ cho chữ) · success --og-positive #3f7d55 4.4:1 (ramp #16a34a 3.30:1). */
525
+ .tone-fg-critical {
526
+ color: rgb(var(--og-sev-critical));
527
+ }
528
+ .tone-fg-danger {
529
+ color: rgb(var(--og-sev-danger));
530
+ }
531
+ .tone-fg-warning {
532
+ color: rgb(var(--og-warning));
533
+ }
534
+ .tone-fg-success {
535
+ color: rgb(var(--og-positive));
536
+ }
537
+ .tone-fg-information {
538
+ color: rgb(var(--og-neutral-soft-fg));
539
+ }
540
+ .tone-fg-discovery {
541
+ color: rgb(var(--og-accent-soft-fg));
542
+ }
543
+ .tone-fg-neutral {
544
+ color: rgb(var(--og-text-faint));
545
+ }
546
+
547
+ /* Chấm trạng thái trong HÀNG (`● Confirmed`) — demo dùng màu semantic. */
548
+ .tone-dot-critical {
549
+ background: rgb(var(--og-sev-critical));
550
+ }
551
+ .tone-dot-danger {
552
+ background: rgb(var(--og-negative));
553
+ }
554
+ .tone-dot-warning {
555
+ background: rgb(var(--og-warning));
556
+ }
557
+ .tone-dot-success {
558
+ background: rgb(var(--og-positive));
559
+ }
560
+ .tone-dot-information {
561
+ background: rgb(var(--og-neutral-soft-fg));
562
+ }
563
+ .tone-dot-discovery {
564
+ background: rgb(var(--og-accent));
565
+ }
566
+ .tone-dot-neutral {
567
+ background: rgb(var(--og-text-faint));
568
+ }
569
+
570
+ /* Chấm LEGEND của chart — phải TRÙNG màu cung nên dùng ramp `--og-sev-*`. */
571
+ .tone-dot-chart-critical {
572
+ background: rgb(var(--og-sev-critical));
573
+ }
574
+ .tone-dot-chart-danger {
575
+ background: rgb(var(--og-sev-danger));
576
+ }
577
+ .tone-dot-chart-warning {
578
+ background: rgb(var(--og-sev-warning));
579
+ }
580
+ .tone-dot-chart-success {
581
+ background: rgb(var(--og-sev-success));
582
+ }
583
+ .tone-dot-chart-information {
584
+ background: rgb(var(--og-neutral-soft-fg));
585
+ }
586
+ .tone-dot-chart-discovery {
587
+ background: rgb(var(--og-accent));
588
+ }
589
+ .tone-dot-chart-neutral {
590
+ background: rgb(var(--og-text-faint));
591
+ }
592
+
593
+ /* Hình dạng pill của badge severity — demo: 999px · 11.5px · weight 400. */
594
+ .tone-badge {
595
+ display: inline-flex;
596
+ align-items: center;
597
+ border-radius: var(--og-radius-pill);
598
+ gap: 5px;
599
+ padding: 3px 10px;
600
+ font-size: var(--og-fs-xs);
601
+ font-weight: 400;
602
+ line-height: 1.5;
603
+ white-space: nowrap;
604
+ }
605
+
606
+ .btn-cta {
607
+ @apply btn-common bg-cta hover:bg-cta-hover text-white;
608
+ box-shadow:
609
+ inset 0 1px 0 rgb(255 255 255 / 0.18),
610
+ 0 1px 2px rgb(0 0 0 / 0.15);
338
611
  }
339
612
  .btn-alternative {
340
613
  @apply btn-common hover:bg-bg-hover text-text-primary border border-border-default;
@@ -376,43 +649,55 @@ input[type='password'] {
376
649
  @apply tag-common bg-bg-hover;
377
650
  }
378
651
  .tag-success {
379
- @apply tag-common bg-success/20;
652
+ @apply tag-common;
653
+ background: color-mix(in srgb, rgb(var(--og-sev-success)) 12%, rgb(var(--og-surface)));
380
654
  }
381
655
  .tag-warning {
382
- @apply tag-common bg-warning/20;
656
+ @apply tag-common;
657
+ background: color-mix(in srgb, rgb(var(--og-sev-warning)) 16%, rgb(var(--og-surface)));
383
658
  }
384
659
  .tag-danger {
385
- @apply tag-common bg-danger/20;
660
+ @apply tag-common;
661
+ background: color-mix(in srgb, rgb(var(--og-sev-danger)) 12%, rgb(var(--og-surface)));
386
662
  }
387
663
  .tag-critical {
388
- @apply tag-common bg-critical/20;
664
+ @apply tag-common;
665
+ background: color-mix(in srgb, rgb(var(--og-sev-critical)) 12%, rgb(var(--og-surface)));
389
666
  }
390
667
  .tag-discovery {
391
- @apply tag-common bg-discovery/20;
668
+ @apply tag-common;
669
+ background: rgb(var(--og-accent-soft-bg));
392
670
  }
393
671
  .tag-information {
394
- @apply tag-common bg-information/20;
672
+ @apply tag-common;
673
+ background: rgb(var(--og-neutral-soft-bg));
395
674
  }
396
675
  .tag-default-solid {
397
676
  @apply tag-common bg-bg-hover;
398
677
  }
399
678
  .tag-success-solid {
400
- @apply tag-common bg-success;
679
+ @apply tag-common;
680
+ background: rgb(var(--og-positive));
401
681
  }
402
682
  .tag-warning-solid {
403
- @apply tag-common bg-warning;
683
+ @apply tag-common;
684
+ background: rgb(var(--og-warning));
404
685
  }
405
686
  .tag-danger-solid {
406
- @apply tag-common bg-danger;
687
+ @apply tag-common;
688
+ background: rgb(var(--og-sev-danger));
407
689
  }
408
690
  .tag-critical-solid {
409
- @apply tag-common bg-critical;
691
+ @apply tag-common;
692
+ background: rgb(var(--og-sev-critical));
410
693
  }
411
694
  .tag-discovery-solid {
412
- @apply tag-common bg-discovery;
695
+ @apply tag-common;
696
+ background: rgb(var(--og-accent));
413
697
  }
414
698
  .tag-information-solid {
415
- @apply tag-common bg-information;
699
+ @apply tag-common;
700
+ background: rgb(var(--og-neutral-soft-fg));
416
701
  }
417
702
  .tag-square {
418
703
  @apply rounded-md px-semi py-small;
@@ -474,7 +759,7 @@ input[type='password'] {
474
759
  .border-gradient-primary {
475
760
  border: 1px solid transparent;
476
761
  background:
477
- linear-gradient(var(--surface, #fff), var(--surface, #fff)) padding-box,
762
+ linear-gradient(rgb(var(--og-surface)), rgb(var(--og-surface))) padding-box,
478
763
  linear-gradient(
479
764
  135deg,
480
765
  rgb(var(--gradient-primary-start)),
@@ -482,5 +767,22 @@ input[type='password'] {
482
767
  ) border-box;
483
768
  }
484
769
  .skeleton-load {
485
- @apply rounded bg-gray-200 animate-pulse motion-reduce:animate-none;
770
+ @apply rounded bg-track animate-pulse motion-reduce:animate-none;
771
+ }
772
+
773
+ /* ============================================================================
774
+ Route skeleton — ẩn nội dung CŨ trong lúc skeleton của route mới đang hiện.
775
+
776
+ ⚠️ PHẢI ĐỂ Ở CSS TOÀN CỤC, không đặt trong .scss của component.
777
+ Component đang active do ROUTER tạo, nên nó KHÔNG mang attribute
778
+ `_ngcontent-*` của template chứa `<router-outlet>`. View encapsulation
779
+ (emulated) thêm attribute đó vào selector con, nên rule viết trong
780
+ component .scss chỉ ẩn được `<router-outlet>` — chính component thật thì
781
+ không. Đã bị đúng bẫy này khi test standalone (`app-projects` vẫn hiện).
782
+
783
+ `<router-outlet>` và component active là hai node NGANG CẤP nên không bọc
784
+ được, phải loại trừ theo selector.
785
+ ============================================================================ */
786
+ .fx-rs-busy > *:not(fx-ui-route-skeleton) {
787
+ display: none !important;
486
788
  }
package/dialogs.css CHANGED
@@ -1,6 +1,6 @@
1
1
  .fx-dialog {
2
2
  max-width: unset !important;
3
- border-radius: 8px !important;
3
+ border-radius: var(--og-radius-card) !important;
4
4
  .mat-dialog-actions {
5
5
  border-top: 1px solid rgb(var(--border-default)) !important;
6
6
  margin-left: -24px;
@@ -40,7 +40,7 @@
40
40
 
41
41
  .mat-dialog-title {
42
42
  background-color: rgb(var(--bg-primary));
43
- box-shadow: 0px 4px 8px rgba(26, 28, 38, 0.15);
43
+ box-shadow: 0px 4px 8px rgb(var(--shadow-color) / 0.15);
44
44
  color: rgb(var(--text-primary));
45
45
  padding: 12px 20px;
46
46
  min-height: 24px;