Seregon/zftpd

Zero-copy FTP/HTTP Daemon compatible with all POSIX systems

C/11.0 KB/No license
web/css/stats-monitor.css
zftpd / web / css / stats-monitor.css
1/* ══ STATS MONITOR MODAL ══════════════════════════════════════════════════
2 * Full-screen modal with tabs: RAM, Disk, Processes, System.
3 * Opened by clicking the stats widget in the topbar.
4 * ═════════════════════════════════════════════════════════════════════════ */
5 
6.smo-overlay {
7 position: fixed;
8 inset: 0;
9 z-index: 5000;
10 background: rgba(0, 0, 0, .72);
11 backdrop-filter: blur(6px);
12 display: flex;
13 align-items: flex-end;
14 justify-content: center;
15 padding: 0;
16 opacity: 0;
17 pointer-events: none;
18 transition: opacity .28s ease;
19}
20 
21.smo-overlay.smo-open {
22 opacity: 1;
23 pointer-events: auto;
24}
25 
26.smo-modal {
27 width: 100%;
28 max-width: 1280px;
29 height: 88vh;
30 max-height: 900px;
31 display: flex;
32 flex-direction: column;
33 background: var(--sf);
34 border: 1px solid var(--bd2);
35 border-radius: 18px 18px 0 0;
36 box-shadow: 0 -20px 80px rgba(0, 0, 0, .6);
37 overflow: hidden;
38 transform: translateY(40px);
39 opacity: 0;
40 transition: transform .28s cubic-bezier(.22, 1, .36, 1), opacity .28s ease;
41}
42 
43.smo-overlay.smo-open .smo-modal {
44 transform: translateY(0);
45 opacity: 1;
46}
47 
48.smo-modal.smo-closing {
49 transform: translateY(40px);
50 opacity: 0;
51 transition: transform .2s ease-in, opacity .2s ease-in;
52}
53 
54/* ── Header ── */
55.smo-head {
56 display: flex;
57 align-items: center;
58 gap: 10px;
59 padding: 14px 20px 0;
60 flex-shrink: 0;
61}
62 
63.smo-title {
64 font-size: 15px;
65 font-weight: 800;
66 background: linear-gradient(90deg, var(--ac), var(--ac2));
67 -webkit-background-clip: text;
68 -webkit-text-fill-color: transparent;
69 background-clip: text;
70 letter-spacing: -.01em;
71}
72 
73.smo-head-btns {
74 margin-left: auto;
75 display: flex;
76 gap: 6px;
77}
78 
79.smo-btn-icon {
80 background: none;
81 border: 1px solid var(--bd2);
82 color: var(--tx2);
83 border-radius: 7px;
84 width: 30px;
85 height: 30px;
86 display: flex;
87 align-items: center;
88 justify-content: center;
89 cursor: pointer;
90 font-size: 14px;
91 transition: border-color .15s, color .15s;
92 font-family: inherit;
93}
94 
95.smo-btn-icon:hover {
96 border-color: var(--ac);
97 color: var(--tx);
98}
99 
100.smo-btn-icon.smo-close:hover {
101 border-color: var(--er);
102 color: var(--er);
103}
104 
105/* ── Tabs ── */
106.smo-tabs {
107 display: flex;
108 gap: 2px;
109 padding: 10px 20px 0;
110 border-bottom: 1px solid var(--bd);
111 flex-shrink: 0;
112}
113 
114.smo-tab {
115 padding: 7px 16px;
116 font-size: 11px;
117 font-weight: 600;
118 color: var(--tx2);
119 border-radius: 7px 7px 0 0;
120 cursor: pointer;
121 border: 1px solid transparent;
122 border-bottom: none;
123 margin-bottom: -1px;
124 background: none;
125 font-family: inherit;
126 letter-spacing: .04em;
127 text-transform: uppercase;
128 transition: color .15s, background .15s;
129 white-space: nowrap;
130}
131 
132.smo-tab:hover {
133 color: var(--tx);
134 background: var(--sf2);
135}
136 
137.smo-tab.smo-tab-active {
138 color: var(--ac);
139 background: var(--sf2);
140 border-color: var(--bd);
141 border-bottom-color: var(--sf2);
142}
143 
144/* ── Body ── */
145.smo-body {
146 flex: 1;
147 overflow-y: auto;
148 padding: 18px 20px;
149}
150 
151.smo-section {
152 display: none;
153}
154 
155.smo-section.smo-active {
156 display: block;
157 animation: fadeIn .15s ease;
158}
159 
160/* ── Footer ── */
161.smo-footer {
162 display: flex;
163 align-items: center;
164 gap: 10px;
165 padding: 10px 20px;
166 border-top: 1px solid var(--bd);
167 font-size: 11px;
168 color: var(--tx2);
169 flex-shrink: 0;
170}
171 
172.smo-live-dot {
173 width: 7px;
174 height: 7px;
175 border-radius: 50%;
176 background: var(--ok);
177 box-shadow: 0 0 6px var(--ok);
178 animation: pulse 2s ease-in-out infinite;
179 flex-shrink: 0;
180}
181 
182/* ── Cards ── */
183.smo-card {
184 background: var(--sf2);
185 border: 1px solid var(--bd);
186 border-radius: 13px;
187 padding: 16px;
188}
189 
190.smo-card-title {
191 font-size: 10px;
192 font-weight: 700;
193 color: var(--tx3);
194 text-transform: uppercase;
195 letter-spacing: .1em;
196 margin-bottom: 12px;
197 display: flex;
198 align-items: center;
199 gap: 6px;
200}
201 
202/* ── Grids ── */
203.smo-grid-2 {
204 display: grid;
205 grid-template-columns: 1fr 1fr;
206 gap: 14px;
207}
208 
209.smo-grid-3 {
210 display: grid;
211 grid-template-columns: 1fr 1fr 1fr;
212 gap: 14px;
213 margin-top: 14px;
214}
215 
216/* ── Gauge ── */
217.smo-gauge {
218 display: flex;
219 flex-direction: column;
220 align-items: center;
221 gap: 14px;
222}
223 
224.smo-gauge-wrap {
225 position: relative;
226 width: 120px;
227 height: 120px;
228}
229 
230.smo-gauge-wrap svg {
231 transform: rotate(-90deg);
232}
233 
234.smo-gauge-center {
235 position: absolute;
236 inset: 0;
237 display: flex;
238 flex-direction: column;
239 align-items: center;
240 justify-content: center;
241 gap: 2px;
242}
243 
244.smo-gauge-pct {
245 font-size: 22px;
246 font-weight: 700;
247 color: var(--ac);
248 line-height: 1;
249}
250 
251.smo-gauge-label {
252 font-size: 9px;
253 color: var(--tx3);
254 text-transform: uppercase;
255 letter-spacing: .08em;
256}
257 
258/* ── Bars ── */
259.smo-bar {
260 height: 6px;
261 border-radius: var(--radius-pill);
262 background: var(--bd);
263 overflow: hidden;
264 margin-top: 8px;
265}
266 
267.smo-bar-fill {
268 height: 100%;
269 border-radius: var(--radius-pill);
270 background: linear-gradient(90deg, var(--ac), var(--ac2));
271 transition: width .6s ease;
272 width: 0%;
273}
274 
275.smo-bar-fill.ok { background: linear-gradient(90deg, var(--ok), #16a34a); }
276.smo-bar-fill.wn { background: linear-gradient(90deg, var(--wn), #d97706); }
277.smo-bar-fill.cr { background: linear-gradient(90deg, var(--er), #dc2626); }
278 
279/* ── Metrics ── */
280.smo-metric {
281 display: flex;
282 flex-direction: column;
283 gap: 4px;
284}
285 
286.smo-metric-label {
287 font-size: 10px;
288 color: var(--tx3);
289 text-transform: uppercase;
290 letter-spacing: .08em;
291}
292 
293.smo-metric-val {
294 font-size: 20px;
295 font-weight: 700;
296 color: var(--tx);
297 line-height: 1.1;
298}
299 
300.smo-metric-sub {
301 font-size: 10px;
302 color: var(--tx2);
303}
304 
305/* ── Process table ── */
306.smo-table {
307 width: 100%;
308 border-collapse: collapse;
309 font-size: 11px;
310}
311 
312.smo-table thead th {
313 text-align: left;
314 padding: 7px 10px;
315 font-size: 10px;
316 font-weight: 700;
317 color: var(--tx3);
318 text-transform: uppercase;
319 letter-spacing: .08em;
320 border-bottom: 1px solid var(--bd2);
321 cursor: pointer;
322 user-select: none;
323 white-space: nowrap;
324}
325 
326.smo-table thead th:hover { color: var(--ac); }
327 
328.smo-table tbody tr {
329 border-bottom: 1px solid var(--bd);
330 transition: background .1s;
331}
332 
333.smo-table tbody tr:hover { background: var(--sf2); }
334 
335.smo-table tbody td {
336 padding: 7px 10px;
337 vertical-align: middle;
338}
339 
340.smo-pid { color: var(--tx3); font-size: 10px; }
341.smo-name { font-weight: 600; max-width: 150px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
342.smo-user { color: var(--tx2); }
343.smo-cpu { color: var(--tx); }
344.smo-cpu.hot { color: var(--er); font-weight: 700; }
345.smo-mem { color: var(--tx2); }
346 
347.smo-badge {
348 display: inline-flex;
349 align-items: center;
350 gap: 3px;
351 padding: 2px 8px;
352 border-radius: var(--radius-pill);
353 font-size: 10px;
354 font-weight: 600;
355 cursor: default;
356}
357 
358.smo-badge-kill {
359 background: rgba(255, 95, 87, .12);
360 color: var(--er);
361 border: 1px solid rgba(255, 95, 87, .25);
362 cursor: pointer;
363}
364 
365.smo-badge-kill:hover {
366 background: rgba(255, 95, 87, .25);
367}
368 
369.smo-badge-sys {
370 background: var(--sf3);
371 color: var(--tx3);
372 border: 1px solid var(--bd);
373}
374 
375.smo-badge-zmb {
376 background: rgba(240, 165, 0, .12);
377 color: var(--wn);
378 border: 1px solid rgba(240, 165, 0, .25);
379}
380 
381/* ── Responsive ── */
382@media (max-width: 768px) {
383 .smo-modal {
384 height: 95vh;
385 max-height: none;
386 border-radius: 14px 14px 0 0;
387 }
388 
389 .smo-grid-2 { grid-template-columns: 1fr; }
390 .smo-grid-3 { grid-template-columns: 1fr 1fr; }
391 .smo-tabs { overflow-x: auto; scrollbar-width: none; }
392 .smo-tabs::-webkit-scrollbar { display: none; }
393}
394