/ web / src / lib / style.css
style.css
  1  @font-face {
  2      font-family: 'Inter';
  3      src: url('/Inter-Regular.woff2') format('woff2'),
  4          url('/Inter-Regular.woff') format('woff');
  5      font-weight: normal;
  6      font-style: normal;
  7      font-display: swap;
  8  }
  9  
 10  
 11  * {
 12      margin: 0;
 13      padding: 0;
 14      box-sizing: border-box;
 15      font-family: 'Inter';
 16  }
 17  
 18  :root {
 19      background: #171721;
 20  }
 21  
 22  body {
 23      background: #0f0f13;
 24      color: #e1e1e3;
 25      padding: 2rem;
 26      min-height: 100vh;
 27      background: linear-gradient(135deg, #0f0f13 0%, #171721 100%);
 28  }
 29  
 30  .scroll-locked {
 31      overflow: hidden;
 32      position: fixed;
 33      width: 100%;
 34      height: 100%;
 35  }
 36  
 37  h1 {
 38      text-align: center;
 39      margin-bottom: 2rem;
 40      font-size: 2.5rem;
 41      background: linear-gradient(45deg, #4ade80, #3b82f6);
 42      -webkit-background-clip: text;
 43      background-clip: text;
 44      -webkit-text-fill-color: transparent;
 45      text-shadow: 0 0 30px rgba(74, 222, 128, 0.2);
 46  }
 47  
 48  .dashboard {
 49      max-width: 1200px;
 50      margin: 0 auto;
 51  }
 52  
 53  .tabs {
 54      display: flex;
 55      margin-bottom: 1rem;
 56      border-bottom: 1px solid rgba(255, 255, 255, 0.1);
 57      padding-bottom: 1px;
 58      overflow-x: auto;
 59  }
 60  
 61  a,
 62  a:visited,
 63  a:hover,
 64  a:active {
 65      color: inherit;
 66  }
 67  
 68  .tab {
 69      text-decoration: none;
 70      padding: 0.8rem 1.5rem;
 71      cursor: pointer;
 72      opacity: 0.7;
 73      transition: all 0.3s ease;
 74      border-bottom: 2px solid transparent;
 75  }
 76  
 77  .tab.active {
 78      opacity: 1;
 79      border-bottom: 2px solid #4ade80;
 80      font-weight: 600;
 81  }
 82  
 83  @keyframes fadeIn {
 84      from {
 85          opacity: 0;
 86      }
 87  
 88      to {
 89          opacity: 1;
 90      }
 91  }
 92  
 93  .two-columns {
 94      display: grid;
 95      grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
 96      gap: 1rem;
 97  }
 98  
 99  @media (max-width: 768px) {
100      .two-columns {
101          display: block;
102      }
103  }
104  
105  
106  .card {
107      background: rgba(255, 255, 255, 0.03);
108      border-radius: 15px;
109      padding: 1.5rem;
110      backdrop-filter: blur(10px);
111      margin-bottom: 1rem;
112      border: 1px solid rgba(255, 255, 255, 0.05);
113      box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.37);
114      transition: all 0.3s ease;
115  }
116  
117  .card:hover {
118      border-color: rgba(255, 255, 255, 0.1);
119      box-shadow: 0 8px 32px 0 rgba(74, 222, 128, 0.1);
120  }
121  
122  .card-title {
123      font-size: 1.2rem;
124      margin-bottom: 0.5rem;
125      color: #e1e1e3;
126      opacity: 0.8;
127  }
128  
129  .usage {
130      font-size: 1.5rem;
131      font-weight: 600;
132      display: block;
133      color: #4ade80;
134      text-shadow: 0 0 20px rgba(74, 222, 128, 0.3);
135  }
136  
137  .core-grid {
138      display: grid;
139      grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
140      gap: 1rem;
141      margin-top: 2rem;
142  }
143  
144  .core-item {
145      background: rgba(255, 255, 255, 0.02);
146      padding: 1.2rem;
147      border-radius: 10px;
148      text-align: center;
149      border: 1px solid rgba(255, 255, 255, 0.03);
150      transition: all 0.2s ease;
151  }
152  
153  .core-item:hover {
154      background: rgba(255, 255, 255, 0.04);
155      border-color: rgba(255, 255, 255, 0.08);
156  }
157  
158  .core-value {
159      font-size: 1.5rem;
160      font-weight: 600;
161      color: #3b82f6;
162      text-shadow: 0 0 20px rgba(59, 130, 246, 0.3);
163  }
164  
165  .info-grid-0 {
166      display: grid;
167      grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
168      gap: 1rem;
169  }
170  
171  .info-grid-1 {
172      display: grid;
173      grid-template-columns: repeat(auto-fit, minmax(340px, 1fr));
174      gap: 1rem;
175  }
176  
177  @media (max-width: 768px) {
178      .info-grid-1 {
179          display: block;
180      }
181  }
182  
183  .info-item {
184      display: flex;
185      justify-content: space-between;
186      padding: 0.8rem;
187      border-radius: 8px;
188      background: rgba(255, 255, 255, 0.02);
189      margin-bottom: 0.8rem;
190  }
191  
192  .info-label {
193      opacity: 0.8;
194  }
195  
196  .info-value {
197      font-weight: 600;
198      color: #3b82f6;
199  }
200  
201  .bar {
202      height: 8px;
203      width: 100%;
204      background: rgba(255, 255, 255, 0.1);
205      border-radius: 4px;
206      margin: 0.8rem 0 1.5rem;
207      overflow: hidden;
208  }
209  
210  .bar-fill {
211      height: 100%;
212      background: linear-gradient(90deg, #3b82f6, #4ade80);
213      border-radius: 4px;
214      transition: width 0.5s ease;
215  }
216  
217  /* Add style for load average section */
218  .load-average {
219      display: flex;
220      justify-content: space-between;
221      margin-top: 1rem;
222      gap: 1rem;
223  }
224  
225  .load-item {
226      background: rgba(255, 255, 255, 0.03);
227      border-radius: 10px;
228      padding: 1rem;
229      text-align: center;
230      flex: 1;
231      transition: all 0.2s ease;
232  }
233  
234  @media (max-width: 768px) {
235      .load-average {
236          gap: 0.3rem;
237      }
238  
239      .load-item {
240          padding-left: 0.2rem;
241          padding-right: 0.2rem;
242      }
243  }
244  
245  .load-item:hover {
246      background: rgba(255, 255, 255, 0.05);
247  }
248  
249  .load-label {
250      font-size: 0.9rem;
251      opacity: 0.8;
252  }
253  
254  .load-value {
255      font-size: 1.5rem;
256      font-weight: 600;
257      color: #3b82f6;
258      display: block;
259      margin-top: 0.5rem;
260  }
261  
262  .uptime-value {
263      font-size: 1.2rem;
264      font-weight: 600;
265      color: #4ade80;
266      text-align: center;
267      margin: 1rem 0;
268  }
269  
270  .section-title {
271      font-size: 1.5rem;
272      margin: 2rem 0 1rem;
273      opacity: 0.9;
274      border-bottom: 1px solid rgba(255, 255, 255, 0.1);
275      padding-bottom: 0.5rem;
276  }
277  
278  @keyframes pulse {
279      0% {
280          opacity: 1;
281      }
282  
283      50% {
284          opacity: 0.5;
285      }
286  
287      100% {
288          opacity: 1;
289      }
290  }
291  
292  .status {
293      text-align: center;
294      color: #4ade80;
295      font-size: 0.9rem;
296      margin-top: 1rem;
297      animation: pulse 2s infinite;
298      text-shadow: 0 0 10px rgba(74, 222, 128, 0.3);
299  }
300  
301  .chart-card {
302      background: rgba(255, 255, 255, 0.03);
303      border-radius: 15px;
304      padding: 1.5rem;
305      backdrop-filter: blur(10px);
306      margin: 1rem 0;
307      border: 1px solid rgba(255, 255, 255, 0.05);
308      box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.37);
309  }
310  
311  .chart-controls {
312      margin-bottom: 1rem;
313      display: flex;
314      gap: 1rem;
315      flex-wrap: wrap;
316  }
317  
318  .chart-controls label {
319      display: flex;
320      align-items: center;
321      gap: 0.5rem;
322      cursor: pointer;
323  }
324  
325  .chart-controls input[type="checkbox"] {
326      cursor: pointer;
327  }
328  
329  #coreToggles {
330      display: flex;
331      gap: 1rem;
332      flex-wrap: wrap;
333  }
334  
335  .switch {
336      position: relative;
337      display: inline-block;
338      width: 46px;
339      height: 24px;
340  }
341  
342  .switch input {
343      opacity: 0;
344      width: 0;
345      height: 0;
346  }
347  
348  .slider {
349      position: absolute;
350      cursor: pointer;
351      top: 0;
352      left: 0;
353      right: 0;
354      bottom: 0;
355      background-color: rgba(255, 255, 255, 0.1);
356      transition: .4s;
357      border-radius: 24px;
358  }
359  
360  .slider:before {
361      position: absolute;
362      content: "";
363      height: 18px;
364      width: 18px;
365      left: 3px;
366      bottom: 3px;
367      background-color: #e1e1e3;
368      transition: .4s;
369      border-radius: 50%;
370  }
371  
372  input:checked+.slider {
373      background-color: #4ade80;
374  }
375  
376  input:checked+.slider:before {
377      transform: translateX(22px);
378  }
379  
380  .chart-controls {
381      background: rgba(255, 255, 255, 0.03);
382      padding: 1rem;
383      border-radius: 10px;
384      margin-bottom: 1.5rem;
385  }
386  
387  .chart-controls select {
388      background: rgba(255, 255, 255, 0.05);
389      border: 1px solid rgba(255, 255, 255, 0.1);
390      color: #e1e1e3;
391      padding: 10px 15px;
392      border-radius: 8px;
393      font-size: 0.9rem;
394      outline: none;
395      transition: all 0.3s ease;
396      backdrop-filter: blur(5px);
397      width: 100%;
398      max-width: 300px;
399      appearance: none;
400      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23e1e1e3' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
401      background-repeat: no-repeat;
402      background-position: right 10px center;
403      background-size: 16px;
404      padding-right: 40px;
405  }
406  
407  .chart-controls select:focus {
408      border-color: rgba(74, 222, 128, 0.5);
409      box-shadow: 0 0 0 2px rgba(74, 222, 128, 0.2);
410  }
411  
412  .chart-controls select:hover {
413      background-color: rgba(255, 255, 255, 0.08);
414  }
415  
416  .network-interface,
417  .disk-item {
418      background: rgba(255, 255, 255, 0.02);
419      border-radius: 10px;
420      padding: 1rem;
421      margin-bottom: 1rem;
422      border: 1px solid rgba(255, 255, 255, 0.03);
423      transition: all 0.2s ease;
424  }
425  
426  .network-interface:hover,
427  .disk-item:hover {
428      background: rgba(255, 255, 255, 0.04);
429      border-color: rgba(255, 255, 255, 0.08);
430  }
431  
432  .highlight-value {
433      font-size: 1.5rem;
434      font-weight: 600;
435      color: #4ade80;
436      display: block;
437      margin: 0.5rem 0;
438      text-shadow: 0 0 10px rgba(74, 222, 128, 0.2);
439  }
440  
441  
442  .loading {
443      color: #d1d4dc;
444      text-align: center;
445      padding: 40px;
446      display: flex;
447      flex-direction: column;
448      align-items: center;
449      justify-content: center;
450  }
451  
452  .spinner {
453      width: 50px;
454      height: 50px;
455      border: 4px solid rgba(255, 255, 255, 0.1);
456      border-radius: 50%;
457      border-top: 4px solid #2196F3;
458      animation: spin 1s linear infinite;
459      margin-bottom: 16px;
460  }
461  
462  @keyframes spin {
463      0% {
464          transform: rotate(0deg);
465      }
466  
467      100% {
468          transform: rotate(360deg);
469      }
470  }
471  
472  .error-container {
473      color: #f88;
474      text-align: center;
475      padding: 40px;
476      background: rgba(50, 0, 0, 0.2);
477      border-radius: 8px;
478      margin: 20px 0;
479      border: 1px solid rgba(255, 100, 100, 0.3);
480  }
481  
482  .error-container p:first-of-type {
483      font-size: 20px;
484      font-weight: 500;
485      margin-bottom: 8px;
486  }
487  
488  .retry-button {
489      margin-top: 20px;
490      padding: 8px 16px;
491      background-color: #2196F3;
492      color: white;
493      border: none;
494      border-radius: 4px;
495      cursor: pointer;
496      font-size: 14px;
497      transition: background-color 0.2s;
498  }
499  
500  .retry-button:hover {
501      background-color: #0d8aee;
502  }
503  
504  .no-data {
505      color: #d1d4dc;
506      text-align: center;
507      padding: 40px;
508      background: rgba(0, 0, 0, 0.2);
509      border-radius: 8px;
510      margin: 20px 0;
511  }
512  
513  .no-data p {
514      margin: 8px 0;
515  }
516  
517  .no-data p:first-child {
518      font-size: 18px;
519      font-weight: 500;
520  }