@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/theme.css CHANGED
@@ -1,73 +1,600 @@
1
- .light_theme {
2
- --gradient-primary-start: 124 58 237;
3
- --gradient-primary-end: 79 142 247;
4
- --gradient-success-start: 16 185 129;
5
- --gradient-success-end: 45 212 191;
6
- --bg-primary: 255 255 255;
7
- --bg-canvas: 245 247 250;
8
- --primary: 124 58 237;
9
- --success: 15 140 96;
10
- --warning: 255 199 0;
11
- --critical: 254 4 83;
12
- --danger: 255 122 0;
13
- --discovery: 156 129 255;
14
- --information: 23 127 240;
15
- --text-primary: 36 45 66;
16
- --text-secondary: 97 101 108;
17
- --border-default: 236 236 236;
18
- --text-placeholder:148 151 156;
19
- --step-bg: 12 14 18;
20
- --text-link-primary: 29 122 252;
21
- --bg-primary-hover: 247 247 247;
22
- --text-focus: 255 255 255;
23
- --bg-primary-neutral: 12 14 18;
24
- --text-selected-primary: 124 58 237;
25
- --button-default: 34 38 47;
26
- --text-inverse: 255 255 255;
27
- --bg-error-bold: 215 0 68;
28
- --text-error: 215 0 68;
29
- --border-interactive: 124 58 237;
30
- --border-selected: 124 58 237;
31
- --button-primary: 124 58 237;
32
- --border-strong: 206 207 210;
33
- --border-secondary-hover: 0 199 205;
34
- --bg-secondary-hover: 6 59 70;
1
+ /*
2
+ * OgeniumDashboards theme tokens — FILE SINH TỰ ĐỘNG bởi
3
+ * tools/build-theme-css.mjs từ tools/generated/og-themes.css. ĐỪNG SỬA TAY:
4
+ * node tools/extract-og-tokens.mjs && node tools/build-theme-css.mjs
5
+ *
6
+ * Cơ chế: 6 theme switch bằng attribute data-og-theme trên <html>
7
+ * (ThemeService.setTheme). Màu = RGB triplet để rgb(var(--x)) + alpha
8
+ * modifier (bg-critical/10) và FxUtils.convertColorFromVariable hoạt động.
9
+ *
10
+ * :root = porcelain (default). Legacy alias (--bg-primary, --primary, …)
11
+ * khai báo qua var(--og-*) nên tự theo theme; sẽ gỡ sau campaign V2.
12
+ * Severity: dùng bộ tone LEGACY vivid (--og-tone-*) theo nhóm light/dark —
13
+ * quyết định anh Tú 28/08, palette severity của design V2 quá trầm.
14
+ */
15
+
16
+ :root {
17
+ /* structural giống nhau mọi theme */
18
+ --og-fs-2xs: 10.5px;
19
+ --og-fs-xs: 11.5px;
20
+ --og-fs-sm: 12.5px;
21
+ --og-fs-md: 13.5px;
22
+ --og-fs-lg: 15px;
23
+ --og-fs-xl: 17px;
24
+ --og-fs-2xl: 22px;
25
+ --og-fs-3xl: 26px;
26
+ --og-fs-4xl: 32px;
27
+ --og-space-1: 4px;
28
+ --og-space-2: 8px;
29
+ --og-space-3: 12px;
30
+ --og-space-4: 16px;
31
+ --og-space-5: 20px;
32
+ --og-space-6: 26px;
33
+ --og-space-7: 32px;
34
+ --og-space-8: 40px;
35
+ --og-track-h: 5px;
36
+ --og-rule: 1px;
37
+ --og-tracking-label: 0.08em;
38
+
39
+ /* porcelain (light, DEFAULT) */
40
+ --og-page-bg: 242 242 241; /* #f2f2f1 */
41
+ --og-surface: 255 255 255; /* #ffffff */
42
+ --og-surface-raised: 255 255 255; /* #ffffff */
43
+ --og-surface-sunken: 251 251 250; /* #fbfbfa */
44
+ --og-border: 232 232 232; /* #e8e8e8 */
45
+ --og-border-subtle: 242 243 243; /* #f2f3f3 */
46
+ --og-border-strong: 38 40 44; /* #26282c */
47
+ --og-text: 38 40 44; /* #26282c */
48
+ --og-text-body: 60 63 68; /* #3c3f44 */
49
+ --og-text-muted: 107 112 117; /* #6b7075 */
50
+ --og-text-faint: 155 160 166; /* #9ba0a6 */
51
+ --og-accent: 124 58 237; /* #7c3aed — violet V1 */
52
+ --og-accent-fg: 124 58 237; /* #7c3aed */
53
+ --og-accent-contrast: 255 255 255; /* #ffffff */
54
+ --og-accent-soft-bg: 242 235 253; /* #f2ebfd */
55
+ --og-accent-soft-fg: 102 48 194; /* #6630c2 */
56
+ --og-positive: 63 125 85; /* #3f7d55 */
57
+ --og-positive-soft-bg: 230 241 234; /* #e6f1ea */
58
+ --og-negative: 192 69 47; /* #c0452f */
59
+ --og-negative-soft-bg: 251 234 231; /* #fbeae7 */
60
+ --og-warning: 168 116 31; /* #a8741f */
61
+ --og-warning-soft-bg: 251 241 222; /* #fbf1de */
62
+ --og-neutral-soft-bg: 238 240 242; /* #eef0f2 */
63
+ --og-neutral-soft-fg: 75 80 87; /* #4b5057 */
64
+ --og-track: 236 236 236; /* #ececec */
65
+ --og-radius-frame: 10px;
66
+ --og-radius-card: 9px;
67
+ --og-radius-control: 7px;
68
+ --og-radius-pill: 999px;
69
+ --og-font-body: "Archivo", system-ui, sans-serif;
70
+ --og-font-display: "Archivo", system-ui, sans-serif;
71
+ --og-font-mono: "JetBrains Mono", ui-monospace, monospace;
72
+ --og-font-prose: "Source Serif 4", Georgia, serif;
73
+ --og-font-figure: var(--og-font-body);
74
+ /* derived (script-generated, KHÔNG có trong design gốc) */
75
+ --og-derived-critical: 169 0 42; /* #a9002a */
76
+ --og-derived-critical-soft-bg: 239 194 191; /* #efc2bf */
77
+ --og-derived-gradient-accent-end: 79 142 247; /* #4f8ef7 — gradient end V1 */
78
+ --og-derived-gradient-positive-end: 87 149 108; /* #57956c */
79
+ --shadow-color: 0 0 0;
80
+ /* severity tones — bộ LEGACY (vivid), không lấy từ design V2 */
81
+ --og-tone-success: 15 140 96;
82
+ --og-tone-warning: 255 199 0;
83
+ --og-tone-critical: 254 4 83;
84
+ --og-tone-danger: 255 122 0;
85
+ --og-tone-information: 23 127 240;
86
+ --og-tone-discovery: 156 129 255;
87
+
88
+ /* ---- LEGACY ALIASES (@deprecated — gỡ khi kết thúc campaign V2) ----
89
+ Các biến cũ trỏ vào --og-* qua var() nên chỉ cần khai báo MỘT lần:
90
+ var() resolve tại element sử dụng, giá trị og đúng theo theme đang active. */
91
+ --gradient-primary-start: var(--og-accent);
92
+ --gradient-primary-end: var(--og-derived-gradient-accent-end);
93
+ --gradient-success-start: var(--og-positive);
94
+ --gradient-success-end: var(--og-derived-gradient-positive-end);
95
+ --bg-primary: var(--og-surface);
96
+ --bg-canvas: var(--og-page-bg);
97
+ --primary: var(--og-accent);
98
+ --success: var(--og-tone-success);
99
+ --warning: var(--og-tone-warning);
100
+ --critical: var(--og-tone-critical);
101
+ --danger: var(--og-tone-danger);
102
+ --discovery: var(--og-tone-discovery);
103
+ --information: var(--og-tone-information);
104
+ --text-primary: var(--og-text);
105
+ --text-secondary: var(--og-text-muted);
106
+ --border-default: var(--og-border);
107
+ --text-placeholder: var(--og-text-faint);
108
+ --step-bg: var(--og-text);
109
+ --text-link-primary: var(--og-accent-fg);
110
+ --bg-primary-hover: var(--og-surface-sunken);
111
+ --text-focus: var(--og-accent-contrast);
112
+ --bg-primary-neutral: var(--og-border-strong);
113
+ --text-selected-primary: var(--og-accent-fg);
114
+ --button-default: var(--og-text);
115
+ --text-inverse: var(--og-surface);
116
+ --bg-error-bold: var(--og-negative);
117
+ --text-error: var(--og-negative);
118
+ --border-interactive: var(--og-accent);
119
+ --border-selected: var(--og-accent);
120
+ --button-primary: var(--og-accent);
121
+ --border-strong: var(--og-border-strong);
122
+ --border-secondary-hover: var(--og-accent);
123
+ --bg-secondary-hover: var(--og-neutral-soft-bg);
124
+ }
125
+
126
+ :root[data-og-theme='porcelain'] {
127
+ --og-page-bg: 242 242 241; /* #f2f2f1 */
128
+ --og-surface: 255 255 255; /* #ffffff */
129
+ --og-surface-raised: 255 255 255; /* #ffffff */
130
+ --og-surface-sunken: 251 251 250; /* #fbfbfa */
131
+ --og-border: 232 232 232; /* #e8e8e8 */
132
+ --og-border-subtle: 242 243 243; /* #f2f3f3 */
133
+ --og-border-strong: 38 40 44; /* #26282c */
134
+ --og-text: 38 40 44; /* #26282c */
135
+ --og-text-body: 60 63 68; /* #3c3f44 */
136
+ --og-text-muted: 107 112 117; /* #6b7075 */
137
+ --og-text-faint: 155 160 166; /* #9ba0a6 */
138
+ --og-accent: 124 58 237; /* #7c3aed — violet V1 */
139
+ --og-accent-fg: 124 58 237; /* #7c3aed */
140
+ --og-accent-contrast: 255 255 255; /* #ffffff */
141
+ --og-accent-soft-bg: 242 235 253; /* #f2ebfd */
142
+ --og-accent-soft-fg: 102 48 194; /* #6630c2 */
143
+ --og-positive: 63 125 85; /* #3f7d55 */
144
+ --og-positive-soft-bg: 230 241 234; /* #e6f1ea */
145
+ --og-negative: 192 69 47; /* #c0452f */
146
+ --og-negative-soft-bg: 251 234 231; /* #fbeae7 */
147
+ --og-warning: 168 116 31; /* #a8741f */
148
+ --og-warning-soft-bg: 251 241 222; /* #fbf1de */
149
+ --og-neutral-soft-bg: 238 240 242; /* #eef0f2 */
150
+ --og-neutral-soft-fg: 75 80 87; /* #4b5057 */
151
+ --og-track: 236 236 236; /* #ececec */
152
+ --og-radius-frame: 10px;
153
+ --og-radius-card: 9px;
154
+ --og-radius-control: 7px;
155
+ --og-radius-pill: 999px;
156
+ --og-font-body: "Archivo", system-ui, sans-serif;
157
+ --og-font-display: "Archivo", system-ui, sans-serif;
158
+ --og-font-mono: "JetBrains Mono", ui-monospace, monospace;
159
+ --og-font-prose: "Source Serif 4", Georgia, serif;
160
+ --og-font-figure: var(--og-font-body);
161
+ /* derived (script-generated, KHÔNG có trong design gốc) */
162
+ --og-derived-critical: 169 0 42; /* #a9002a */
163
+ --og-derived-critical-soft-bg: 239 194 191; /* #efc2bf */
164
+ --og-derived-gradient-accent-end: 79 142 247; /* #4f8ef7 — gradient end V1 */
165
+ --og-derived-gradient-positive-end: 87 149 108; /* #57956c */
35
166
  --shadow-color: 0 0 0;
167
+ /* severity tones — bộ LEGACY (vivid), không lấy từ design V2 */
168
+ --og-tone-success: 15 140 96;
169
+ --og-tone-warning: 255 199 0;
170
+ --og-tone-critical: 254 4 83;
171
+ --og-tone-danger: 255 122 0;
172
+ --og-tone-information: 23 127 240;
173
+ --og-tone-discovery: 156 129 255;
36
174
  }
37
175
 
38
- :root {
39
- --gradient-primary-start: 124 58 237;
40
- --gradient-primary-end: 79 142 247;
41
- --gradient-success-start: 16 185 129;
42
- --gradient-success-end: 45 212 191;
43
- --bg-primary: 12 14 18;
44
- --bg-canvas: 8 9 12;
45
- --primary: 124 58 237;
46
- --success: 76 175 80;
47
- --warning: 255 188 59;
48
- --critical: 236 25 56;
49
- --danger: 249 133 7;
50
- --discovery: 119 113 227;
51
- --information: 62 175 240;
52
- --text-primary: 247 247 247;
53
- --text-secondary: 133 136 142;
54
- --border-default: 55 58 65;
55
- --text-placeholder: 133 136 142;
56
- --step-bg: 255 255 255;
57
- --text-link-primary: 87 157 255;
58
- --bg-primary-hover: 34 38 47;
59
- --text-focus: 255 255 255;
60
- --bg-primary-neutral: 12 14 18;
61
- --text-selected-primary: 124 58 237;
62
- --button-default: 236 236 236;
63
- --text-inverse: 12 14 18;
64
- --bg-error-bold: 215 0 68;
65
- --text-error: 255 0 81;
66
- --border-interactive: 124 58 237;
67
- --border-selected: 124 58 237;
68
- --button-primary: 124 58 237;
69
- --border-strong: 97 101 108;
70
- --border-secondary-hover: 0 199 205;
71
- --bg-secondary-hover: 6 59 70;
176
+ :root[data-og-theme='charcoal'] {
177
+ --og-page-bg: 14 14 16; /* #0e0e10 */
178
+ --og-surface: 26 23 23; /* #1a1717 */
179
+ --og-surface-raised: 33 28 27; /* #211c1b */
180
+ --og-surface-sunken: 40 34 33; /* #282221 */
181
+ --og-border: 48 41 40; /* #302928 */
182
+ --og-border-subtle: 36 31 30; /* #241f1e */
183
+ --og-border-strong: 74 63 61; /* #4a3f3d */
184
+ --og-text: 240 239 236; /* #f0efec */
185
+ --og-text-body: 214 212 207; /* #d6d4cf */
186
+ --og-text-muted: 139 138 132; /* #8b8a84 */
187
+ --og-text-faint: 110 109 104; /* #6e6d68 */
188
+ --og-accent: 255 107 74; /* #ff6b4a */
189
+ --og-accent-fg: 255 107 74; /* #ff6b4a */
190
+ --og-accent-contrast: 46 21 13; /* #2e150d */
191
+ --og-accent-soft-bg: 46 29 24; /* #2e1d18 */
192
+ --og-accent-soft-fg: 255 143 117; /* #ff8f75 */
193
+ --og-positive: 95 191 122; /* #5fbf7a */
194
+ --og-positive-soft-bg: 29 47 40; /* #1d2f28 */
195
+ --og-negative: 224 118 106; /* #e0766a */
196
+ --og-negative-soft-bg: 51 35 35; /* #332323 */
197
+ --og-warning: 217 146 78; /* #d9924e */
198
+ --og-warning-soft-bg: 51 40 15; /* #33280f */
199
+ --og-neutral-soft-bg: 40 34 33; /* #282221 */
200
+ --og-neutral-soft-fg: 179 176 169; /* #b3b0a9 */
201
+ --og-track: 46 39 38; /* #2e2726 */
202
+ --og-radius-frame: 10px;
203
+ --og-radius-card: 9px;
204
+ --og-radius-control: 7px;
205
+ --og-radius-pill: 999px;
206
+ --og-font-body: "Archivo", system-ui, sans-serif;
207
+ --og-font-display: "Archivo", system-ui, sans-serif;
208
+ --og-font-mono: "IBM Plex Mono", ui-monospace, monospace;
209
+ --og-font-prose: "Source Serif 4", Georgia, serif;
210
+ --og-font-figure: var(--og-font-body);
211
+ /* derived (script-generated, KHÔNG có trong design gốc) */
212
+ --og-derived-critical: 246 107 130; /* #f66b82 */
213
+ --og-derived-critical-soft-bg: 86 49 52; /* #563134 */
214
+ --og-derived-gradient-accent-end: 255 140 106; /* #ff8c6a */
215
+ --og-derived-gradient-positive-end: 121 217 147; /* #79d993 */
72
216
  --shadow-color: 255 255 255;
73
- }
217
+ /* severity tones — bộ LEGACY (vivid), không lấy từ design V2 */
218
+ --og-tone-success: 76 175 80;
219
+ --og-tone-warning: 255 188 59;
220
+ --og-tone-critical: 236 25 56;
221
+ --og-tone-danger: 249 133 7;
222
+ --og-tone-information: 62 175 240;
223
+ --og-tone-discovery: 119 113 227;
224
+ }
225
+
226
+ :root[data-og-theme='ivory'] {
227
+ --og-page-bg: 232 230 225; /* #e8e6e1 */
228
+ --og-surface: 250 249 245; /* #faf9f5 */
229
+ --og-surface-raised: 255 255 255; /* #ffffff */
230
+ --og-surface-sunken: 253 251 246; /* #fdfbf6 */
231
+ --og-border: 232 228 218; /* #e8e4da */
232
+ --og-border-subtle: 245 242 234; /* #f5f2ea */
233
+ --og-border-strong: 42 38 32; /* #2a2620 */
234
+ --og-text: 42 38 32; /* #2a2620 */
235
+ --og-text-body: 61 57 41; /* #3d3929 */
236
+ --og-text-muted: 138 131 113; /* #8a8371 */
237
+ --og-text-faint: 163 157 141; /* #a39d8d */
238
+ --og-accent: 217 119 87; /* #d97757 */
239
+ --og-accent-fg: 176 108 78; /* #b06c4e */
240
+ --og-accent-contrast: 250 249 245; /* #faf9f5 */
241
+ --og-accent-soft-bg: 247 237 231; /* #f7ede7 */
242
+ --og-accent-soft-fg: 176 108 78; /* #b06c4e */
243
+ --og-positive: 111 143 106; /* #6f8f6a */
244
+ --og-positive-soft-bg: 234 240 231; /* #eaf0e7 */
245
+ --og-negative: 176 74 74; /* #b04a4a */
246
+ --og-negative-soft-bg: 246 233 231; /* #f6e9e7 */
247
+ --og-warning: 168 116 31; /* #a8741f */
248
+ --og-warning-soft-bg: 247 239 221; /* #f7efdd */
249
+ --og-neutral-soft-bg: 241 237 227; /* #f1ede3 */
250
+ --og-neutral-soft-fg: 107 100 85; /* #6b6455 */
251
+ --og-track: 234 230 220; /* #eae6dc */
252
+ --og-radius-frame: 12px;
253
+ --og-radius-card: 14px;
254
+ --og-radius-control: 999px;
255
+ --og-radius-pill: 999px;
256
+ --og-font-body: "Archivo", system-ui, sans-serif;
257
+ --og-font-display: "Newsreader", Georgia, serif;
258
+ --og-font-mono: "JetBrains Mono", ui-monospace, monospace;
259
+ --og-font-prose: "Source Serif 4", Georgia, serif;
260
+ --og-font-figure: var(--og-font-display);
261
+ /* derived (script-generated, KHÔNG có trong design gốc) */
262
+ --og-derived-critical: 154 11 57; /* #9a0b39 */
263
+ --og-derived-critical-soft-bg: 232 192 193; /* #e8c0c1 */
264
+ --og-derived-gradient-accent-end: 245 144 111; /* #f5906f */
265
+ --og-derived-gradient-positive-end: 135 168 130; /* #87a882 */
266
+ --shadow-color: 0 0 0;
267
+ /* severity tones — bộ LEGACY (vivid), không lấy từ design V2 */
268
+ --og-tone-success: 15 140 96;
269
+ --og-tone-warning: 255 199 0;
270
+ --og-tone-critical: 254 4 83;
271
+ --og-tone-danger: 255 122 0;
272
+ --og-tone-information: 23 127 240;
273
+ --og-tone-discovery: 156 129 255;
274
+ }
275
+
276
+ :root[data-og-theme='studio'] {
277
+ --og-page-bg: 14 14 16; /* #0e0e10 */
278
+ --og-surface: 35 35 34; /* #232322 */
279
+ --og-surface-raised: 43 43 41; /* #2b2b29 */
280
+ --og-surface-sunken: 38 38 37; /* #262625 */
281
+ --og-border: 58 58 55; /* #3a3a37 */
282
+ --og-border-subtle: 50 50 47; /* #32322f */
283
+ --og-border-strong: 85 85 79; /* #55554f */
284
+ --og-text: 236 235 230; /* #ecebe6 */
285
+ --og-text-body: 214 213 208; /* #d6d5d0 */
286
+ --og-text-muted: 181 180 174; /* #b5b4ae */
287
+ --og-text-faint: 143 142 136; /* #8f8e88 */
288
+ --og-accent: 90 143 214; /* #5a8fd6 */
289
+ --og-accent-fg: 126 168 224; /* #7ea8e0 */
290
+ --og-accent-contrast: 16 26 38; /* #101a26 */
291
+ --og-accent-soft-bg: 43 46 51; /* #2b2e33 */
292
+ --og-accent-soft-fg: 126 168 224; /* #7ea8e0 */
293
+ --og-positive: 107 189 133; /* #6bbd85 */
294
+ --og-positive-soft-bg: 31 49 38; /* #1f3126 */
295
+ --og-negative: 217 117 106; /* #d9756a */
296
+ --og-negative-soft-bg: 51 34 31; /* #33221f */
297
+ --og-warning: 217 154 61; /* #d99a3d */
298
+ --og-warning-soft-bg: 77 58 30; /* #4d3a1e */
299
+ --og-neutral-soft-bg: 46 46 44; /* #2e2e2c */
300
+ --og-neutral-soft-fg: 196 195 189; /* #c4c3bd */
301
+ --og-track: 32 52 77; /* #20344d */
302
+ --og-radius-frame: 14px;
303
+ --og-radius-card: 11px;
304
+ --og-radius-control: 9px;
305
+ --og-radius-pill: 999px;
306
+ --og-font-body: "Archivo", system-ui, sans-serif;
307
+ --og-font-display: "Archivo", system-ui, sans-serif;
308
+ --og-font-mono: "IBM Plex Mono", ui-monospace, monospace;
309
+ --og-font-prose: "Source Serif 4", Georgia, serif;
310
+ --og-font-figure: var(--og-font-body);
311
+ /* derived (script-generated, KHÔNG có trong design gốc) */
312
+ --og-derived-critical: 238 108 128; /* #ee6c80 */
313
+ --og-derived-critical-soft-bg: 85 48 49; /* #553031 */
314
+ --og-derived-gradient-accent-end: 120 174 248; /* #78aef8 */
315
+ --og-derived-gradient-positive-end: 132 215 158; /* #84d79e */
316
+ --shadow-color: 255 255 255;
317
+ /* severity tones — bộ LEGACY (vivid), không lấy từ design V2 */
318
+ --og-tone-success: 76 175 80;
319
+ --og-tone-warning: 255 188 59;
320
+ --og-tone-critical: 236 25 56;
321
+ --og-tone-danger: 249 133 7;
322
+ --og-tone-information: 62 175 240;
323
+ --og-tone-discovery: 119 113 227;
324
+ }
325
+
326
+ :root[data-og-theme='blueprint'] {
327
+ --og-page-bg: 14 14 16; /* #0e0e10 */
328
+ --og-surface: 15 15 17; /* #0f0f11 */
329
+ --og-surface-raised: 22 22 26; /* #16161a */
330
+ --og-surface-sunken: 28 28 32; /* #1c1c20 */
331
+ --og-border: 35 35 38; /* #232326 */
332
+ --og-border-subtle: 25 25 28; /* #19191c */
333
+ --og-border-strong: 58 58 64; /* #3a3a40 */
334
+ --og-text: 240 240 242; /* #f0f0f2 */
335
+ --og-text-body: 207 207 212; /* #cfcfd4 */
336
+ --og-text-muted: 115 115 120; /* #737378 */
337
+ --og-text-faint: 80 80 85; /* #505055 */
338
+ --og-accent: 224 122 58; /* #e07a3a */
339
+ --og-accent-fg: 240 160 113; /* #f0a071 */
340
+ --og-accent-contrast: 22 16 10; /* #16100a */
341
+ --og-accent-soft-bg: 42 29 18; /* #2a1d12 */
342
+ --og-accent-soft-fg: 240 160 113; /* #f0a071 */
343
+ --og-positive: 91 143 110; /* #5b8f6e */
344
+ --og-positive-soft-bg: 22 36 29; /* #16241d */
345
+ --og-negative: 179 101 79; /* #b3654f */
346
+ --og-negative-soft-bg: 42 26 21; /* #2a1a15 */
347
+ --og-warning: 201 160 78; /* #c9a04e */
348
+ --og-warning-soft-bg: 42 35 19; /* #2a2313 */
349
+ --og-neutral-soft-bg: 28 28 32; /* #1c1c20 */
350
+ --og-neutral-soft-fg: 168 168 174; /* #a8a8ae */
351
+ --og-track: 35 35 38; /* #232326 */
352
+ --og-radius-frame: 0px;
353
+ --og-radius-card: 0px;
354
+ --og-radius-control: 0px;
355
+ --og-radius-pill: 0px;
356
+ --og-font-body: "IBM Plex Mono", ui-monospace, monospace;
357
+ --og-font-display: "Newsreader", Georgia, serif;
358
+ --og-font-mono: "IBM Plex Mono", ui-monospace, monospace;
359
+ --og-font-prose: "Source Serif 4", Georgia, serif;
360
+ --og-font-figure: var(--og-font-mono);
361
+ /* derived (script-generated, KHÔNG có trong design gốc) */
362
+ --og-derived-critical: 216 93 120; /* #d85d78 */
363
+ --og-derived-critical-soft-bg: 73 39 39; /* #492727 */
364
+ --og-derived-gradient-accent-end: 255 154 91; /* #ff9a5b */
365
+ --og-derived-gradient-positive-end: 115 168 134; /* #73a886 */
366
+ --shadow-color: 255 255 255;
367
+ /* severity tones — bộ LEGACY (vivid), không lấy từ design V2 */
368
+ --og-tone-success: 76 175 80;
369
+ --og-tone-warning: 255 188 59;
370
+ --og-tone-critical: 236 25 56;
371
+ --og-tone-danger: 249 133 7;
372
+ --og-tone-information: 62 175 240;
373
+ --og-tone-discovery: 119 113 227;
374
+ }
375
+
376
+ :root[data-og-theme='terminal'] {
377
+ --og-page-bg: 232 230 225; /* #e8e6e1 */
378
+ --og-surface: 244 242 234; /* #f4f2ea */
379
+ --og-surface-raised: 250 249 243; /* #faf9f3 */
380
+ --og-surface-sunken: 235 232 221; /* #ebe8dd */
381
+ --og-border: 204 200 187; /* #ccc8bb */
382
+ --og-border-subtle: 232 229 218; /* #e8e5da */
383
+ --og-border-strong: 22 22 22; /* #161616 */
384
+ --og-text: 22 22 22; /* #161616 */
385
+ --og-text-body: 46 46 46; /* #2e2e2e */
386
+ --og-text-muted: 110 105 89; /* #6e6959 */
387
+ --og-text-faint: 138 132 116; /* #8a8474 */
388
+ --og-accent: 58 85 217; /* #3a55d9 */
389
+ --og-accent-fg: 58 85 217; /* #3a55d9 */
390
+ --og-accent-contrast: 244 242 234; /* #f4f2ea */
391
+ --og-accent-soft-bg: 227 230 247; /* #e3e6f7 */
392
+ --og-accent-soft-fg: 44 66 171; /* #2c42ab */
393
+ --og-positive: 47 143 88; /* #2f8f58 */
394
+ --og-positive-soft-bg: 226 239 230; /* #e2efe6 */
395
+ --og-negative: 192 69 47; /* #c0452f */
396
+ --og-negative-soft-bg: 247 230 226; /* #f7e6e2 */
397
+ --og-warning: 168 122 34; /* #a87a22 */
398
+ --og-warning-soft-bg: 245 236 216; /* #f5ecd8 */
399
+ --og-neutral-soft-bg: 226 223 212; /* #e2dfd4 */
400
+ --og-neutral-soft-fg: 90 86 74; /* #5a564a */
401
+ --og-track: 226 223 212; /* #e2dfd4 */
402
+ --og-radius-frame: 0px;
403
+ --og-radius-card: 0px;
404
+ --og-radius-control: 0px;
405
+ --og-radius-pill: 0px;
406
+ --og-font-body: "JetBrains Mono", ui-monospace, monospace;
407
+ --og-font-display: "JetBrains Mono", ui-monospace, monospace;
408
+ --og-font-mono: "JetBrains Mono", ui-monospace, monospace;
409
+ --og-font-prose: "Source Serif 4", Georgia, serif;
410
+ --og-font-figure: var(--og-font-mono);
411
+ /* derived (script-generated, KHÔNG có trong design gốc) */
412
+ --og-derived-critical: 169 0 42; /* #a9002a */
413
+ --og-derived-critical-soft-bg: 236 191 187; /* #ecbfbb */
414
+ --og-derived-gradient-accent-end: 78 111 245; /* #4e6ff5 */
415
+ --og-derived-gradient-positive-end: 75 168 111; /* #4ba86f */
416
+ --shadow-color: 0 0 0;
417
+ /* severity tones — bộ LEGACY (vivid), không lấy từ design V2 */
418
+ --og-tone-success: 15 140 96;
419
+ --og-tone-warning: 255 199 0;
420
+ --og-tone-critical: 254 4 83;
421
+ --og-tone-danger: 255 122 0;
422
+ --og-tone-information: 23 127 240;
423
+ --og-tone-discovery: 156 129 255;
424
+ }
425
+
426
+ /* ---- SKEW SHIELD (transitional) -------------------------------------
427
+ Remote build CŨ ship stylesheet tự khai legacy vars literal trên :root
428
+ (dark) và .light_theme — load SAU css host nên thắng ở :root. Khai lại
429
+ alias ở body-level (0,1,1) để thắng cả .light_theme (0,1,0) của bundle
430
+ cũ lẫn :root literal, bất kể thứ tự load. Gỡ khi mọi app đã lên V2. */
431
+ [data-og-theme] body {
432
+ /* ---- LEGACY ALIASES (@deprecated — gỡ khi kết thúc campaign V2) ----
433
+ Các biến cũ trỏ vào --og-* qua var() nên chỉ cần khai báo MỘT lần:
434
+ var() resolve tại element sử dụng, giá trị og đúng theo theme đang active. */
435
+ --gradient-primary-start: var(--og-accent);
436
+ --gradient-primary-end: var(--og-derived-gradient-accent-end);
437
+ --gradient-success-start: var(--og-positive);
438
+ --gradient-success-end: var(--og-derived-gradient-positive-end);
439
+ --bg-primary: var(--og-surface);
440
+ --bg-canvas: var(--og-page-bg);
441
+ --primary: var(--og-accent);
442
+ --success: var(--og-tone-success);
443
+ --warning: var(--og-tone-warning);
444
+ --critical: var(--og-tone-critical);
445
+ --danger: var(--og-tone-danger);
446
+ --discovery: var(--og-tone-discovery);
447
+ --information: var(--og-tone-information);
448
+ --text-primary: var(--og-text);
449
+ --text-secondary: var(--og-text-muted);
450
+ --border-default: var(--og-border);
451
+ --text-placeholder: var(--og-text-faint);
452
+ --step-bg: var(--og-text);
453
+ --text-link-primary: var(--og-accent-fg);
454
+ --bg-primary-hover: var(--og-surface-sunken);
455
+ --text-focus: var(--og-accent-contrast);
456
+ --bg-primary-neutral: var(--og-border-strong);
457
+ --text-selected-primary: var(--og-accent-fg);
458
+ --button-default: var(--og-text);
459
+ --text-inverse: var(--og-surface);
460
+ --bg-error-bold: var(--og-negative);
461
+ --text-error: var(--og-negative);
462
+ --border-interactive: var(--og-accent);
463
+ --border-selected: var(--og-accent);
464
+ --button-primary: var(--og-accent);
465
+ --border-strong: var(--og-border-strong);
466
+ --border-secondary-hover: var(--og-accent);
467
+ --bg-secondary-hover: var(--og-neutral-soft-bg);
468
+ }
469
+
470
+ /* ---- STALE-HOST FALLBACK (transitional) -----------------------------
471
+ Host CŨ không set data-og-theme, chỉ toggle .light_theme trên body.
472
+ Map light→porcelain (đã là :root default), dark→charcoal — cả hai kèm
473
+ alias ở body-level để đè literal của stylesheet host cũ. Remote chạy
474
+ standalone không set theme cũng rơi vào nhánh charcoal (khớp hành vi
475
+ dark-default cũ). */
476
+ html:not([data-og-theme]) body:not(.light_theme) {
477
+ --og-page-bg: 14 14 16; /* #0e0e10 */
478
+ --og-surface: 26 23 23; /* #1a1717 */
479
+ --og-surface-raised: 33 28 27; /* #211c1b */
480
+ --og-surface-sunken: 40 34 33; /* #282221 */
481
+ --og-border: 48 41 40; /* #302928 */
482
+ --og-border-subtle: 36 31 30; /* #241f1e */
483
+ --og-border-strong: 74 63 61; /* #4a3f3d */
484
+ --og-text: 240 239 236; /* #f0efec */
485
+ --og-text-body: 214 212 207; /* #d6d4cf */
486
+ --og-text-muted: 139 138 132; /* #8b8a84 */
487
+ --og-text-faint: 110 109 104; /* #6e6d68 */
488
+ --og-accent: 255 107 74; /* #ff6b4a */
489
+ --og-accent-fg: 255 107 74; /* #ff6b4a */
490
+ --og-accent-contrast: 46 21 13; /* #2e150d */
491
+ --og-accent-soft-bg: 46 29 24; /* #2e1d18 */
492
+ --og-accent-soft-fg: 255 143 117; /* #ff8f75 */
493
+ --og-positive: 95 191 122; /* #5fbf7a */
494
+ --og-positive-soft-bg: 29 47 40; /* #1d2f28 */
495
+ --og-negative: 224 118 106; /* #e0766a */
496
+ --og-negative-soft-bg: 51 35 35; /* #332323 */
497
+ --og-warning: 217 146 78; /* #d9924e */
498
+ --og-warning-soft-bg: 51 40 15; /* #33280f */
499
+ --og-neutral-soft-bg: 40 34 33; /* #282221 */
500
+ --og-neutral-soft-fg: 179 176 169; /* #b3b0a9 */
501
+ --og-track: 46 39 38; /* #2e2726 */
502
+ --og-radius-frame: 10px;
503
+ --og-radius-card: 9px;
504
+ --og-radius-control: 7px;
505
+ --og-radius-pill: 999px;
506
+ --og-font-body: "Archivo", system-ui, sans-serif;
507
+ --og-font-display: "Archivo", system-ui, sans-serif;
508
+ --og-font-mono: "IBM Plex Mono", ui-monospace, monospace;
509
+ --og-font-prose: "Source Serif 4", Georgia, serif;
510
+ --og-font-figure: var(--og-font-body);
511
+ /* derived (script-generated, KHÔNG có trong design gốc) */
512
+ --og-derived-critical: 246 107 130; /* #f66b82 */
513
+ --og-derived-critical-soft-bg: 86 49 52; /* #563134 */
514
+ --og-derived-gradient-accent-end: 255 140 106; /* #ff8c6a */
515
+ --og-derived-gradient-positive-end: 121 217 147; /* #79d993 */
516
+ --shadow-color: 255 255 255;
517
+ /* severity tones — bộ LEGACY (vivid), không lấy từ design V2 */
518
+ --og-tone-success: 76 175 80;
519
+ --og-tone-warning: 255 188 59;
520
+ --og-tone-critical: 236 25 56;
521
+ --og-tone-danger: 249 133 7;
522
+ --og-tone-information: 62 175 240;
523
+ --og-tone-discovery: 119 113 227;
524
+
525
+ /* ---- LEGACY ALIASES (@deprecated — gỡ khi kết thúc campaign V2) ----
526
+ Các biến cũ trỏ vào --og-* qua var() nên chỉ cần khai báo MỘT lần:
527
+ var() resolve tại element sử dụng, giá trị og đúng theo theme đang active. */
528
+ --gradient-primary-start: var(--og-accent);
529
+ --gradient-primary-end: var(--og-derived-gradient-accent-end);
530
+ --gradient-success-start: var(--og-positive);
531
+ --gradient-success-end: var(--og-derived-gradient-positive-end);
532
+ --bg-primary: var(--og-surface);
533
+ --bg-canvas: var(--og-page-bg);
534
+ --primary: var(--og-accent);
535
+ --success: var(--og-tone-success);
536
+ --warning: var(--og-tone-warning);
537
+ --critical: var(--og-tone-critical);
538
+ --danger: var(--og-tone-danger);
539
+ --discovery: var(--og-tone-discovery);
540
+ --information: var(--og-tone-information);
541
+ --text-primary: var(--og-text);
542
+ --text-secondary: var(--og-text-muted);
543
+ --border-default: var(--og-border);
544
+ --text-placeholder: var(--og-text-faint);
545
+ --step-bg: var(--og-text);
546
+ --text-link-primary: var(--og-accent-fg);
547
+ --bg-primary-hover: var(--og-surface-sunken);
548
+ --text-focus: var(--og-accent-contrast);
549
+ --bg-primary-neutral: var(--og-border-strong);
550
+ --text-selected-primary: var(--og-accent-fg);
551
+ --button-default: var(--og-text);
552
+ --text-inverse: var(--og-surface);
553
+ --bg-error-bold: var(--og-negative);
554
+ --text-error: var(--og-negative);
555
+ --border-interactive: var(--og-accent);
556
+ --border-selected: var(--og-accent);
557
+ --button-primary: var(--og-accent);
558
+ --border-strong: var(--og-border-strong);
559
+ --border-secondary-hover: var(--og-accent);
560
+ --bg-secondary-hover: var(--og-neutral-soft-bg);
561
+ }
562
+
563
+ html:not([data-og-theme]) body.light_theme {
564
+ /* ---- LEGACY ALIASES (@deprecated — gỡ khi kết thúc campaign V2) ----
565
+ Các biến cũ trỏ vào --og-* qua var() nên chỉ cần khai báo MỘT lần:
566
+ var() resolve tại element sử dụng, giá trị og đúng theo theme đang active. */
567
+ --gradient-primary-start: var(--og-accent);
568
+ --gradient-primary-end: var(--og-derived-gradient-accent-end);
569
+ --gradient-success-start: var(--og-positive);
570
+ --gradient-success-end: var(--og-derived-gradient-positive-end);
571
+ --bg-primary: var(--og-surface);
572
+ --bg-canvas: var(--og-page-bg);
573
+ --primary: var(--og-accent);
574
+ --success: var(--og-tone-success);
575
+ --warning: var(--og-tone-warning);
576
+ --critical: var(--og-tone-critical);
577
+ --danger: var(--og-tone-danger);
578
+ --discovery: var(--og-tone-discovery);
579
+ --information: var(--og-tone-information);
580
+ --text-primary: var(--og-text);
581
+ --text-secondary: var(--og-text-muted);
582
+ --border-default: var(--og-border);
583
+ --text-placeholder: var(--og-text-faint);
584
+ --step-bg: var(--og-text);
585
+ --text-link-primary: var(--og-accent-fg);
586
+ --bg-primary-hover: var(--og-surface-sunken);
587
+ --text-focus: var(--og-accent-contrast);
588
+ --bg-primary-neutral: var(--og-border-strong);
589
+ --text-selected-primary: var(--og-accent-fg);
590
+ --button-default: var(--og-text);
591
+ --text-inverse: var(--og-surface);
592
+ --bg-error-bold: var(--og-negative);
593
+ --text-error: var(--og-negative);
594
+ --border-interactive: var(--og-accent);
595
+ --border-selected: var(--og-accent);
596
+ --button-primary: var(--og-accent);
597
+ --border-strong: var(--og-border-strong);
598
+ --border-secondary-hover: var(--og-accent);
599
+ --bg-secondary-hover: var(--og-neutral-soft-bg);
600
+ }