wynai commited on
Commit
75f5149
·
verified ·
1 Parent(s): ef0df5e

Update custom.css

Browse files
Files changed (1) hide show
  1. custom.css +139 -149
custom.css CHANGED
@@ -3,206 +3,171 @@ WynGPT - custom.css (updated)
3
  ***************************/
4
 
5
  /* === Voice mode button: gradient + blur + glow === */
6
- [aria-label="Voice mode"] {
7
- background: linear-gradient(135deg, #ffffff, #cceeff, #99ddff, #66ccff, #33ccff, #00ccff);
8
  background-size: 600% 600%;
9
  animation: blendShift 16s ease-in-out infinite;
10
- color: #fff;
11
- border: none;
12
- backdrop-filter: blur(10px);
13
- -webkit-backdrop-filter: blur(10px);
14
- box-shadow: 0 0 20px rgba(0, 204, 255, .4), 0 0 40px rgba(0, 204, 255, .3), 0 0 60px rgba(0, 204, 255, .2);
15
- transition: .3s;
16
- position: relative;
17
- z-index: 1;
18
- }
19
- @keyframes blendShift {
20
- 0% { background-position: 0% 50% }
21
- 50% { background-position: 100% 50% }
22
- 100% { background-position: 0% 50% }
23
  }
 
 
 
 
 
 
 
24
 
25
  /* === Tooltip (Tippy) blur === */
26
- .tippy-box {
27
- background: rgba(255, 255, 255, .1) !important;
28
- backdrop-filter: blur(10px) !important;
29
- -webkit-backdrop-filter: blur(10px) !important;
30
- color: #000 !important;
31
- border: 1px solid rgba(0, 0, 0, .1) !important;
32
  }
33
- html.dark .tippy-box, :root.dark .tippy-box {
34
- background: rgba(0, 0, 0, .1) !important;
35
- backdrop-filter: blur(10px) !important;
36
- -webkit-backdrop-filter: blur(10px) !important;
37
- color: #fff !important;
38
- border: 1px solid rgba(255, 255, 255, .1) !important;
39
  }
40
 
 
 
41
  /* ================= Khung nhập tin nhắn ================= */
42
- html.light #message-textarea {
43
- backdrop-filter: blur(8px);
44
- -webkit-backdrop-filter: blur(8px);
45
- background: rgba(255, 255, 255, .5) !important;
46
- color: #000 !important;
47
- border: 1px solid rgba(0, 0, 0, .1);
48
- border-radius: 8px;
49
  }
50
- html.dark #message-textarea, :root.dark #message-textarea {
51
- backdrop-filter: blur(8px);
52
- -webkit-backdrop-filter: blur(8px);
53
- background: rgba(0, 0, 0, .35) !important;
54
- color: #fff !important;
55
- border: 1px solid rgba(255, 255, 255, .1);
56
- border-radius: 8px;
57
  }
58
 
59
  /* ================= Popup / Menu ================= */
60
- html:has([role="dialog"][data-state="open"]), html:has([role="menu"][data-state="open"]) { position: relative; }
61
  html.light:has([role="dialog"][data-state="open"])::before,
62
- html.light:has([role="menu"][data-state="open"])::before {
63
- content: "";
64
- position: fixed;
65
- inset: 0;
66
- z-index: 40;
67
- background: rgba(255, 255, 255, .1);
68
- backdrop-filter: blur(10px);
69
- -webkit-backdrop-filter: blur(10px);
70
- pointer-events: none;
71
  }
72
  html.dark:has([role="dialog"][data-state="open"])::before,
73
- html.dark:has([role="menu"][data-state="open"])::before {
74
- content: "";
75
- position: fixed;
76
- inset: 0;
77
- z-index: 40;
78
- background: rgba(0, 0, 0, .18);
79
- backdrop-filter: blur(10px);
80
- -webkit-backdrop-filter: blur(10px);
81
- pointer-events: none;
82
  }
83
 
84
  /* Popup/menu mờ ĐẬM hơn với màu blur mới */
85
- html.light [role="dialog"], html.light [role="menu"] {
86
- background: rgba(255, 255, 255, 0.2) !important;
87
- backdrop-filter: blur(10px) !important;
88
- -webkit-backdrop-filter: blur(10px) !important;
89
  color: inherit !important;
90
- border-radius: 12px;
91
- overflow: hidden;
92
- border: 1px solid rgba(0, 0, 0, .12);
93
- position: relative;
94
- z-index: 50 !important;
95
  }
96
- html.dark [role="dialog"], html.dark [role="menu"] {
97
- background: rgba(255, 255, 255, 0.2) !important;
98
- backdrop-filter: blur(10px) !important;
99
- -webkit-backdrop-filter: blur(10px) !important;
100
  color: inherit !important;
101
- border-radius: 12px;
102
- overflow: hidden;
103
- border: 1px solid rgba(255, 255, 255, .12);
104
- position: relative;
105
- z-index: 50 !important;
106
  }
107
 
108
  /* ================= Cài đặt: POPUP (center, bigger) ================= */
109
- [role="dialog"] {
110
  position: fixed !important;
111
- top: 50% !important;
112
- left: 50% !important;
113
- transform: translate(-50%, -50%) !important;
114
  width: min(960px, 96vw) !important;
115
- max-height: 90vh !important;
116
- height: auto !important;
117
- margin: 0 !important;
118
- max-width: none !important;
119
- border-radius: 16px !important;
120
  overflow: auto !important;
121
  }
122
 
123
  /* Không blur các phần con bên trong dialog */
124
- [role="dialog"] * {
125
  backdrop-filter: none !important;
126
  -webkit-backdrop-filter: none !important;
127
  background-color: transparent;
128
  }
129
 
130
  /* Nút LƯU */
131
- [role="dialog"] button:is(#save-button, [type="submit"], [aria-label*="Lưu" i], [aria-label*="Save" i], [data-action="save"], [data-testid*="save" i], [id*="save" i], [class*="save" i]) {
132
- border-radius: 10px;
133
- padding: .55rem 1rem;
134
- font-weight: 600;
135
- border: 1px solid rgba(0, 0, 0, .8);
136
- background: #000;
137
- color: #fff;
138
  transition: transform .12s ease, opacity .2s ease;
139
  }
140
- [role="dialog"] button:is(#save-button, [type="submit"], [aria-label*="Lưu" i], [aria-label*="Save" i], [data-action="save"], [data-testid*="save" i], [id*="save" i], [class*="save" i]):hover { opacity: .9 }
141
- [role="dialog"] button:is(#save-button, [type="submit"], [aria-label*="Lưu" i], [aria-label*="Save" i], [data-action="save"], [data-testid*="save" i], [id*="save" i], [class*="save" i]):active { transform: translateY(1px) }
142
- html.dark [role="dialog"] button:is(#save-button, [type="submit"], [aria-label*="Lưu" i], [aria-label*="Save" i], [data-action="save"], [data-testid*="save" i], [id*="save" i], [class*="save" i]) {
143
- background: #fff;
144
- color: #000;
145
- border-color: rgba(255, 255, 255, .85);
146
  }
147
 
148
  /* Toast/thông báo luôn rõ */
149
- [role="status"], .toast, [data-sonner-toaster] {
150
- position: relative;
151
- z-index: 60;
152
- backdrop-filter: none !important;
153
- -webkit-backdrop-filter: none !important;
154
  }
155
 
156
- /* Switch */
157
- [role="switch"] {
158
  position: relative;
159
- display: inline-flex;
160
- align-items: center;
161
- justify-content: flex-start;
162
- width: 36px;
163
- height: 20px;
164
- border-radius: 999px;
165
- background: rgba(0, 0, 0, .2);
166
  transition: background-color .25s ease, box-shadow .25s ease;
167
  }
168
- html.dark [role="switch"] { background: rgba(255, 255, 255, .25); }
169
- [role="switch"]::before {
170
- content: "";
171
- position: absolute;
172
- top: 2px;
173
- left: 2px;
174
- width: 16px;
175
- height: 16px;
176
- border-radius: 999px;
177
- background: #fff;
178
- box-shadow: 0 1px 2px rgba(0, 0, 0, .25);
179
  transition: transform .25s ease;
180
  }
181
- html.dark [role="switch"]::before { background: #000; box-shadow: 0 1px 2px rgba(0, 0, 0, .35); }
 
182
  [role="switch"][aria-checked="true"] {
183
- background-color: #0099ff !important;
184
- box-shadow: 0 0 10px rgba(0, 153, 255, 0.7) !important;
185
- transition: background-color 0.3s ease, box-shadow 0.3s ease;
186
  }
187
- [role="switch"][aria-checked="true"]::before { transform: translateX(16px); }
 
 
 
 
 
 
 
 
 
 
 
 
188
 
189
- /* Light mode send button */
190
- #send-message-button { background-color: #33ccff !important; }
191
 
192
- /* Dark mode send button */
193
- html.dark #send-message-button, :root.dark #send-message-button { background-color: #0099ff !important; }
194
 
195
- /* Loading bar + label */
196
  html:not(:has(#logo))::before,
197
  html:not(:has(#logo))::after,
198
- body:not(:has(#logo))::after { content: none !important; }
 
 
199
  html {
200
  --bar-w: 220px;
201
  --bar-h: 8px;
202
  --bar-bottom: 10%;
203
- --track-bg: rgba(255, 255, 255, 0.18);
204
- --glow-1: rgba(59, 130, 246, 0.65);
205
- --glow-2: rgba(56, 189, 248, 0.45);
206
  }
207
  html::before {
208
  content: "";
@@ -214,7 +179,7 @@ html::before {
214
  height: var(--bar-h);
215
  background: var(--track-bg);
216
  border-radius: 999px;
217
- box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.06) inset;
218
  pointer-events: none;
219
  z-index: 9999;
220
  animation: fade-out 1s ease forwards;
@@ -230,12 +195,21 @@ html::after {
230
  border-radius: 999px;
231
  pointer-events: none;
232
  z-index: 10000;
233
- background: linear-gradient(90deg, #60a5fa, #3b82f6, #2563eb, #1d4ed8, #3b82f6, #38bdf8, #0ea5e9, #60a5fa);
 
 
 
 
 
 
 
 
234
  background-size: 300% 100%;
235
  box-shadow: 0 0 10px var(--glow-1), 0 0 18px var(--glow-2);
236
- animation: loading-grow 4s cubic-bezier(0.65, 0, 1, 1) forwards,
237
- loading-shimmer 1.2s linear infinite,
238
- fade-out 1s ease forwards 10s;
 
239
  }
240
  body::after {
241
  content: var(--label, "Đang chuẩn bị mọi thứ");
@@ -250,39 +224,55 @@ body::after {
250
  letter-spacing: 0.2px;
251
  pointer-events: none;
252
  z-index: 10001;
253
- text-shadow: 0 1px 2px rgba(0, 0, 0, 0.45);
 
254
  animation: loading-label 4s cubic-bezier(0.65, 0, 1, 1) forwards, fade-out 1s ease forwards 10s;
255
  }
256
  html.dark body::after { color: #ffffff; }
257
  html.light body::after { color: #1f2937; }
258
 
259
- @keyframes loading-grow { from { width: 0; } to { width: calc(var(--bar-w) * 0.99); } }
260
- @keyframes loading-shimmer { 0% { background-position: 0% 50%; } 100% { background-position: 300% 50%; } }
 
 
 
 
 
 
261
  @keyframes loading-label {
262
  0% { opacity: 1; filter: blur(0px); --label: "Đang chuẩn bị mọi thứ"; }
263
  9% { opacity: 0; filter: blur(6px); }
264
  10% { --label: "Truy xuất CSDL"; opacity: 0; filter: blur(6px); }
265
  11.5%{ opacity: 1; filter: blur(0px); }
 
266
  23% { opacity: 0; filter: blur(6px); }
267
  24% { --label: "Kiểm tra API/MCP"; opacity: 0; filter: blur(6px); }
268
  25.5%{ opacity: 1; filter: blur(0px); }
 
269
  29% { opacity: 0; filter: blur(6px); }
270
  30% { --label: "Xây dựng giao diện"; opacity: 0; filter: blur(6px); }
271
  31.5%{ opacity: 1; filter: blur(0px); }
 
272
  45% { opacity: 0; filter: blur(6px); }
273
  46% { --label: "Đang kết nối đến AWS"; opacity: 0; filter: blur(6px); }
274
  47.5%{ opacity: 1; filter: blur(0px); }
 
275
  68% { opacity: 0; filter: blur(6px); }
276
  69% { --label: "Xác thực user token"; opacity: 0; filter: blur(6px); }
277
  70.5%{ opacity: 1; filter: blur(0px); }
 
278
  87% { opacity: 0; filter: blur(6px); }
279
  88% { --label: "Khởi chạy Plugin"; opacity: 0; filter: blur(6px); }
280
  89.5%{ opacity: 1; filter: blur(0px); }
 
281
  98% { opacity: 0; filter: blur(6px); }
282
  99% { --label: "Kiểm tra lại lần cuối"; opacity: 0; filter: blur(6px); }
283
  100% { opacity: 1; filter: blur(0px); }
284
  }
285
- @keyframes fade-out { to { opacity: 0; visibility: hidden; } }
 
 
 
286
  @media (prefers-reduced-motion: reduce) {
287
  html::after { animation: loading-grow 4s linear forwards, fade-out 1s ease forwards 10s; }
288
  body::after { animation: fade-out 1s ease forwards 10s; }
 
3
  ***************************/
4
 
5
  /* === Voice mode button: gradient + blur + glow === */
6
+ [aria-label="Voice mode"]{
7
+ background: linear-gradient(135deg,#ffffff,#cceeff,#99ddff,#66ccff,#33ccff,#00ccff);
8
  background-size: 600% 600%;
9
  animation: blendShift 16s ease-in-out infinite;
10
+ color:#fff;border:none;
11
+ backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px);
12
+ box-shadow: 0 0 20px rgba(0,204,255,.4),0 0 40px rgba(0,204,255,.3),0 0 60px rgba(0,204,255,.2);
13
+ transition:.3s; position:relative; z-index:1;
 
 
 
 
 
 
 
 
 
14
  }
15
+ @keyframes blendShift{0%{background-position:0% 50%}50%{background-position:100% 50%}100%{background-position:0% 50%}}
16
+
17
+ /* === Send button === */
18
+ /*
19
+ #send-message-button{ background:#33ccff !important; }
20
+ html.dark #send-message-button, :root.dark #send-message-button{ background:#0099ff !important; }
21
+ */
22
 
23
  /* === Tooltip (Tippy) blur === */
24
+ .tippy-box{
25
+ background:rgba(255,255,255,.1) !important;
26
+ backdrop-filter: blur(10px) !important; -webkit-backdrop-filter: blur(10px) !important;
27
+ color:#000 !important; border:1px solid rgba(0,0,0,.1) !important;
 
 
28
  }
29
+ html.dark .tippy-box, :root.dark .tippy-box{
30
+ background:rgba(0,0,0,.1) !important;
31
+ backdrop-filter: blur(10px) !important; -webkit-backdrop-filter: blur(10px) !important;
32
+ color:#fff !important; border:1px solid rgba(255,255,255,.1) !important;
 
 
33
  }
34
 
35
+ /* ================= (Sidebar styles REMOVED as requested) ================= */
36
+
37
  /* ================= Khung nhập tin nhắn ================= */
38
+ html.light #message-textarea{
39
+ backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px);
40
+ background: rgba(255,255,255,.5) !important; color:#000 !important;
41
+ border:1px solid rgba(0,0,0,.1); border-radius:8px;
 
 
 
42
  }
43
+ html.dark #message-textarea, :root.dark #message-textarea{
44
+ backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px);
45
+ background: rgba(0,0,0,.35) !important; color:#fff !important;
46
+ border:1px solid rgba(255,255,255,.1); border-radius:8px;
 
 
 
47
  }
48
 
49
  /* ================= Popup / Menu ================= */
50
+ html:has([role="dialog"][data-state="open"]), html:has([role="menu"][data-state="open"]) { position:relative; }
51
  html.light:has([role="dialog"][data-state="open"])::before,
52
+ html.light:has([role="menu"][data-state="open"])::before{
53
+ content:""; position:fixed; inset:0; z-index: 40;
54
+ background: rgba(255,255,255,.1);
55
+ backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px);
56
+ pointer-events:none;
 
 
 
 
57
  }
58
  html.dark:has([role="dialog"][data-state="open"])::before,
59
+ html.dark:has([role="menu"][data-state="open"])::before{
60
+ content:""; position:fixed; inset:0; z-index: 40;
61
+ background: rgba(0,0,0,.18);
62
+ backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px);
63
+ pointer-events:none;
 
 
 
 
64
  }
65
 
66
  /* Popup/menu mờ ĐẬM hơn với màu blur mới */
67
+ html.light [role="dialog"], html.light [role="menu"]{
68
+ background: rgba(255,255,255,0.5) !important;
69
+ backdrop-filter: blur(10px) !important; -webkit-backdrop-filter: blur(10px) !important;
 
70
  color: inherit !important;
71
+ border-radius:12px; overflow:hidden;
72
+ border:1px solid rgba(0,0,0,.12);
73
+ position:relative; z-index: 50 !important;
 
 
74
  }
75
+ html.dark [role="dialog"], html.dark [role="menu"]{
76
+ background: rgba(23,23,23,0.2) !important;
77
+ backdrop-filter: blur(10px) !important; -webkit-backdrop-filter: blur(10px) !important;
 
78
  color: inherit !important;
79
+ border-radius:12px; overflow:hidden;
80
+ border:1px solid rgba(255,255,255,.12);
81
+ position:relative; z-index: 50 !important;
 
 
82
  }
83
 
84
  /* ================= Cài đặt: POPUP (center, bigger) ================= */
85
+ [role="dialog"]{
86
  position: fixed !important;
87
+ top: 50% !important; left: 50% !important;
88
+ transform: translate(-50%,-50%) !important;
 
89
  width: min(960px, 96vw) !important;
90
+ max-height: 90vh !important; height: auto !important;
91
+ margin:0 !important; max-width:none !important;
92
+ border-radius:16px !important;
 
 
93
  overflow: auto !important;
94
  }
95
 
96
  /* Không blur các phần con bên trong dialog */
97
+ [role="dialog"] *{
98
  backdrop-filter: none !important;
99
  -webkit-backdrop-filter: none !important;
100
  background-color: transparent;
101
  }
102
 
103
  /* Nút LƯU */
104
+ [role="dialog"] button:is(#save-button, [type="submit"], [aria-label*="Lưu" i], [aria-label*="Save" i], [data-action="save"], [data-testid*="save" i], [id*="save" i], [class*="save" i]){
105
+ border-radius: 10px; padding: .55rem 1rem; font-weight:600;
106
+ border:1px solid rgba(0,0,0,.8);
107
+ background:#000; color:#fff;
 
 
 
108
  transition: transform .12s ease, opacity .2s ease;
109
  }
110
+ [role="dialog"] button:is(#save-button, [type="submit"], [aria-label*="Lưu" i], [aria-label*="Save" i], [data-action="save"], [data-testid*="save" i], [id*="save" i], [class*="save" i]):hover{ opacity:.9 }
111
+ [role="dialog"] button:is(#save-button, [type="submit"], [aria-label*="Lưu" i], [aria-label*="Save" i], [data-action="save"], [data-testid*="save" i], [id*="save" i], [class*="save" i]):active{ transform: translateY(1px) }
112
+ html.dark [role="dialog"] button:is(#save-button, [type="submit"], [aria-label*="Lưu" i], [aria-label*="Save" i], [data-action="save"], [data-testid*="save" i], [id*="save" i], [class*="save" i]){
113
+ background:#fff; color:#000; border-color: rgba(255,255,255,.85);
 
 
114
  }
115
 
116
  /* Toast/thông báo luôn rõ */
117
+ [role="status"], .toast, [data-sonner-toaster]{
118
+ position:relative; z-index:60;
119
+ backdrop-filter:none !important; -webkit-backdrop-filter:none !important;
 
 
120
  }
121
 
122
+ [role="switch"]{
 
123
  position: relative;
124
+ display:inline-flex; align-items:center; justify-content:flex-start;
125
+ width: 36px; height: 20px; border-radius:999px;
126
+ background: rgba(0,0,0,.2);
 
 
 
 
127
  transition: background-color .25s ease, box-shadow .25s ease;
128
  }
129
+ html.dark [role="switch"]{ background: rgba(255,255,255,.25); }
130
+
131
+ [role="switch"]::before{
132
+ content:""; position:absolute; top:2px; left:2px; width:16px; height:16px;
133
+ border-radius:999px; background:#fff; box-shadow:0 1px 2px rgba(0,0,0,.25);
 
 
 
 
 
 
134
  transition: transform .25s ease;
135
  }
136
+ html.dark [role="switch"]::before{ background:#000; box-shadow:0 1px 2px rgba(0,0,0,.35); }
137
+
138
  [role="switch"][aria-checked="true"] {
139
+ background-color: #0099ff !important; /* xanh dương */
140
+ box-shadow: 0 0 10px rgba(0, 153, 255, 0.7) !important; /* đổ bóng xanh */
141
+ transition: background-color 0.3s ease, box-shadow 0.3s ease; /* mượt khi chuyển */
142
  }
143
+ [role="switch"][aria-checked="true"]::before{ transform: translateX(16px); }
144
+
145
+ /* Light mode */
146
+ #send-message-button {
147
+ background-color: #33ccff !important;
148
+ }
149
+
150
+ /* Dark mode */
151
+ html.dark #send-message-button,
152
+ :root.dark #send-message-button {
153
+ background-color: #0099ff !important;
154
+ }
155
+
156
 
 
 
157
 
 
 
158
 
 
159
  html:not(:has(#logo))::before,
160
  html:not(:has(#logo))::after,
161
+ body:not(:has(#logo))::after {
162
+ content: none !important;
163
+ }
164
  html {
165
  --bar-w: 220px;
166
  --bar-h: 8px;
167
  --bar-bottom: 10%;
168
+ --track-bg: rgba(255,255,255,0.18);
169
+ --glow-1: rgba(59,130,246,0.65);
170
+ --glow-2: rgba(56,189,248,0.45);
171
  }
172
  html::before {
173
  content: "";
 
179
  height: var(--bar-h);
180
  background: var(--track-bg);
181
  border-radius: 999px;
182
+ box-shadow: 0 0 0 1px rgba(255,255,255,0.06) inset;
183
  pointer-events: none;
184
  z-index: 9999;
185
  animation: fade-out 1s ease forwards;
 
195
  border-radius: 999px;
196
  pointer-events: none;
197
  z-index: 10000;
198
+ background: linear-gradient(90deg,
199
+ #60a5fa,
200
+ #3b82f6,
201
+ #2563eb,
202
+ #1d4ed8,
203
+ #3b82f6,
204
+ #38bdf8,
205
+ #0ea5e9,
206
+ #60a5fa);
207
  background-size: 300% 100%;
208
  box-shadow: 0 0 10px var(--glow-1), 0 0 18px var(--glow-2);
209
+ animation:
210
+ loading-grow 4s cubic-bezier(0.65, 0, 1, 1) forwards,
211
+ loading-shimmer 1.2s linear infinite,
212
+ fade-out 1s ease forwards 10s;
213
  }
214
  body::after {
215
  content: var(--label, "Đang chuẩn bị mọi thứ");
 
224
  letter-spacing: 0.2px;
225
  pointer-events: none;
226
  z-index: 10001;
227
+ color: #1f2937;
228
+ text-shadow: 0 1px 2px rgba(0,0,0,0.45);
229
  animation: loading-label 4s cubic-bezier(0.65, 0, 1, 1) forwards, fade-out 1s ease forwards 10s;
230
  }
231
  html.dark body::after { color: #ffffff; }
232
  html.light body::after { color: #1f2937; }
233
 
234
+ @keyframes loading-grow {
235
+ from { width: 0; }
236
+ to { width: calc(var(--bar-w) * 0.99); }
237
+ }
238
+ @keyframes loading-shimmer {
239
+ 0% { background-position: 0% 50%; }
240
+ 100% { background-position: 300% 50%; }
241
+ }
242
  @keyframes loading-label {
243
  0% { opacity: 1; filter: blur(0px); --label: "Đang chuẩn bị mọi thứ"; }
244
  9% { opacity: 0; filter: blur(6px); }
245
  10% { --label: "Truy xuất CSDL"; opacity: 0; filter: blur(6px); }
246
  11.5%{ opacity: 1; filter: blur(0px); }
247
+
248
  23% { opacity: 0; filter: blur(6px); }
249
  24% { --label: "Kiểm tra API/MCP"; opacity: 0; filter: blur(6px); }
250
  25.5%{ opacity: 1; filter: blur(0px); }
251
+
252
  29% { opacity: 0; filter: blur(6px); }
253
  30% { --label: "Xây dựng giao diện"; opacity: 0; filter: blur(6px); }
254
  31.5%{ opacity: 1; filter: blur(0px); }
255
+
256
  45% { opacity: 0; filter: blur(6px); }
257
  46% { --label: "Đang kết nối đến AWS"; opacity: 0; filter: blur(6px); }
258
  47.5%{ opacity: 1; filter: blur(0px); }
259
+
260
  68% { opacity: 0; filter: blur(6px); }
261
  69% { --label: "Xác thực user token"; opacity: 0; filter: blur(6px); }
262
  70.5%{ opacity: 1; filter: blur(0px); }
263
+
264
  87% { opacity: 0; filter: blur(6px); }
265
  88% { --label: "Khởi chạy Plugin"; opacity: 0; filter: blur(6px); }
266
  89.5%{ opacity: 1; filter: blur(0px); }
267
+
268
  98% { opacity: 0; filter: blur(6px); }
269
  99% { --label: "Kiểm tra lại lần cuối"; opacity: 0; filter: blur(6px); }
270
  100% { opacity: 1; filter: blur(0px); }
271
  }
272
+ @keyframes fade-out {
273
+ to { opacity: 0; visibility: hidden; }
274
+ }
275
+
276
  @media (prefers-reduced-motion: reduce) {
277
  html::after { animation: loading-grow 4s linear forwards, fade-out 1s ease forwards 10s; }
278
  body::after { animation: fade-out 1s ease forwards 10s; }