krsyer-server-monitor-pro 1.0.28 → 1.0.29

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.
@@ -1,1045 +0,0 @@
1
- @import url('https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;400;500;600;700;800&family=Inter:wght@300;400;500;600;700&display=swap');
2
-
3
- :root {
4
- /* Color Palette - Premium SaaS */
5
- --primary: #4f46e5;
6
- --primary-light: #818cf8;
7
- --secondary: #7c3aed;
8
- --accent: #0ea5e9;
9
-
10
- --bg-main: #f8fafc;
11
- --bg-sidebar: #ffffff;
12
- --card-bg: rgba(255, 255, 255, 0.85);
13
- --card-border: rgba(226, 232, 240, 0.6);
14
-
15
- --text-primary: #0f172a;
16
- --text-secondary: #64748b;
17
- --text-muted: #94a3b8;
18
-
19
- --success: #10b981;
20
- --warning: #f59e0b;
21
- --danger: #ef4444;
22
-
23
- /* Shadows - Deep & Soft */
24
- --shadow-soft: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -2px rgba(0, 0, 0, 0.05);
25
- --shadow-card: 0 10px 25px -5px rgba(0, 0, 0, 0.04), 0 8px 10px -6px rgba(0, 0, 0, 0.04);
26
- --shadow-hover: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -6px rgba(0, 0, 0, 0.1);
27
-
28
- --radius-lg: 1.25rem;
29
- --radius-md: 0.75rem;
30
-
31
- --transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
32
- }
33
-
34
- * {
35
- margin: 0;
36
- padding: 0;
37
- box-sizing: border-box;
38
- }
39
-
40
- body {
41
- font-family: 'Plus Jakarta Sans', 'Inter', sans-serif;
42
- background-color: var(--bg-main);
43
- color: var(--text-primary);
44
- min-height: 100vh;
45
- overflow-x: hidden;
46
- line-height: 1.6;
47
- }
48
-
49
- /* Premium Mesh Background */
50
- body::before {
51
- content: '';
52
- position: fixed;
53
- top: 0;
54
- left: 0;
55
- width: 100%;
56
- height: 100%;
57
- z-index: -1;
58
- background:
59
- radial-gradient(at 0% 0%, rgba(79, 70, 229, 0.1) 0px, transparent 50%),
60
- radial-gradient(at 100% 0%, rgba(124, 58, 237, 0.1) 0px, transparent 50%),
61
- radial-gradient(at 100% 100%, rgba(14, 165, 233, 0.1) 0px, transparent 50%),
62
- radial-gradient(at 0% 100%, rgba(236, 72, 153, 0.1) 0px, transparent 50%);
63
- }
64
-
65
- /* Animations */
66
- @keyframes slideUp {
67
- from {
68
- opacity: 0;
69
- transform: translateY(20px);
70
- }
71
-
72
- to {
73
- opacity: 1;
74
- transform: translateY(0);
75
- }
76
- }
77
-
78
- @keyframes fadeIn {
79
- from {
80
- opacity: 0;
81
- }
82
-
83
- to {
84
- opacity: 1;
85
- }
86
- }
87
-
88
- /* Layout Hierarchy */
89
- .app-layout {
90
- display: flex;
91
- min-height: 100vh;
92
- }
93
-
94
- /* Sidebar - Modern & Clean */
95
- .sidebar {
96
- width: 280px;
97
- background: var(--bg-sidebar);
98
- border-right: 1px solid var(--card-border);
99
- padding: 2.5rem 1.5rem;
100
- position: sticky;
101
- top: 0;
102
- height: 100vh;
103
- display: flex;
104
- flex-direction: column;
105
- z-index: 1000;
106
- overflow: hidden;
107
- /* Ensure scrolling happens inside list */
108
- }
109
-
110
- .sidebar-header {
111
- margin-bottom: 2rem;
112
- padding-left: 0.5rem;
113
- }
114
-
115
- .sidebar-header h2 {
116
- font-size: 1.5rem;
117
- font-weight: 800;
118
- letter-spacing: -0.025em;
119
- background: linear-gradient(135deg, var(--primary), var(--secondary));
120
- -webkit-background-clip: text;
121
- background-clip: text;
122
- -webkit-text-fill-color: transparent;
123
- display: flex;
124
- align-items: center;
125
- gap: 0.75rem;
126
- }
127
-
128
- .nav-links {
129
- list-style: none;
130
- flex: 1;
131
- overflow-y: auto;
132
- min-height: 0;
133
- /* Important for flex scrolling */
134
- padding-right: 5px;
135
- /* Space for scrollbar */
136
- }
137
-
138
- .nav-links li {
139
- margin-bottom: 0.625rem;
140
- }
141
-
142
- .nav-link {
143
- display: flex;
144
- align-items: center;
145
- gap: 1rem;
146
- padding: 0.875rem 1.25rem;
147
- color: var(--text-secondary);
148
- text-decoration: none;
149
- border-radius: var(--radius-md);
150
- font-weight: 600;
151
- font-size: 0.95rem;
152
- transition: var(--transition);
153
- }
154
-
155
- .nav-link ion-icon {
156
- font-size: 1.25rem;
157
- transition: var(--transition);
158
- }
159
-
160
- .nav-link:hover {
161
- background: rgba(79, 70, 229, 0.05);
162
- color: var(--primary);
163
- }
164
-
165
- .nav-link.active {
166
- background: var(--primary);
167
- color: #ffffff;
168
- box-shadow: 0 10px 15px -3px rgba(79, 70, 229, 0.25);
169
- }
170
-
171
- .nav-link.active ion-icon {
172
- color: #ffffff;
173
- }
174
-
175
- .sidebar-footer {
176
- padding-top: 1.5rem;
177
- border-top: 1px solid var(--card-border);
178
- margin-top: auto;
179
- /* Push to bottom if space permits */
180
- }
181
-
182
- /* Stylish License Footer */
183
- .sidebar-footer>div {
184
- display: flex !important;
185
- align-items: center;
186
- justify-content: center;
187
- gap: 0.5rem;
188
- margin-top: 1rem !important;
189
- flex-wrap: wrap;
190
- }
191
-
192
- .sidebar-footer br {
193
- display: none;
194
- }
195
-
196
- #license-plan,
197
- #license-expiry {
198
- color: #0f172a;
199
- /* Black/Dark */
200
- font-weight: 700;
201
- font-size: 0.7rem;
202
- background: #f1f5f9;
203
- padding: 0.25rem 0.75rem;
204
- border-radius: 1rem;
205
- border: 1px solid #e2e8f0;
206
- white-space: nowrap;
207
- }
208
-
209
- #license-plan {
210
- color: var(--primary);
211
- background: rgba(79, 70, 229, 0.1);
212
- border-color: rgba(79, 70, 229, 0.2);
213
- }
214
-
215
- .logout-btn-sidebar {
216
- width: 100%;
217
- background: #fff1f2;
218
- color: #e11d48;
219
- border: 1px solid #fecdd3;
220
- padding: 0.875rem;
221
- border-radius: var(--radius-md);
222
- cursor: pointer;
223
- display: flex;
224
- align-items: center;
225
- justify-content: center;
226
- gap: 0.625rem;
227
- font-weight: 700;
228
- font-size: 0.9rem;
229
- transition: var(--transition);
230
- }
231
-
232
- .logout-btn-sidebar:hover {
233
- background: #ffe4e6;
234
- transform: translateY(-2px);
235
- }
236
-
237
- /* Main Content Area */
238
- .main-content {
239
- flex: 1;
240
- padding: 3rem 4rem;
241
- max-width: 1600px;
242
- margin: 0 auto;
243
- animation: fadeIn 0.8s ease-out;
244
- }
245
-
246
- header {
247
- margin-bottom: 3.5rem;
248
- }
249
-
250
- header h1 {
251
- font-size: 2.75rem;
252
- font-weight: 900;
253
- letter-spacing: -0.05em;
254
- color: var(--text-primary);
255
- margin-bottom: 0.75rem;
256
- }
257
-
258
- header p {
259
- color: var(--text-secondary);
260
- font-size: 1.1rem;
261
- font-weight: 500;
262
- }
263
-
264
- /* Cards & Grid */
265
- .dashboard-grid {
266
- display: grid;
267
- grid-template-columns: repeat(auto-fit, minmax(340px, 1fr));
268
- gap: 2rem;
269
- margin-bottom: 3rem;
270
- }
271
-
272
- .card {
273
- background: var(--card-bg);
274
- border: 1px solid var(--card-border);
275
- backdrop-filter: blur(20px);
276
- border-radius: var(--radius-lg);
277
- padding: 2rem;
278
- box-shadow: var(--shadow-card);
279
- transition: var(--transition);
280
- position: relative;
281
- overflow: hidden;
282
- }
283
-
284
- .card:hover {
285
- transform: translateY(-8px);
286
- box-shadow: var(--shadow-hover);
287
- border-color: var(--primary-light);
288
- }
289
-
290
- .card::after {
291
- content: '';
292
- position: absolute;
293
- top: 0;
294
- right: 0;
295
- width: 4px;
296
- height: 0;
297
- background: linear-gradient(to bottom, var(--primary), var(--secondary));
298
- transition: var(--transition);
299
- }
300
-
301
- .card:hover::after {
302
- height: 100%;
303
- }
304
-
305
- .card-header {
306
- display: flex;
307
- justify-content: space-between;
308
- align-items: center;
309
- margin-bottom: 1.75rem;
310
- border-bottom: 1px solid var(--card-border);
311
- padding-bottom: 1rem;
312
- }
313
-
314
- .card-title {
315
- font-size: 1.25rem;
316
- font-weight: 700;
317
- color: var(--text-primary);
318
- display: flex;
319
- align-items: center;
320
- gap: 0.75rem;
321
- }
322
-
323
- .card-icon {
324
- font-size: 1.5rem;
325
- color: var(--primary);
326
- padding: 0.5rem;
327
- background: rgba(79, 70, 229, 0.1);
328
- border-radius: 0.75rem;
329
- }
330
-
331
- /* Info Rows & Stats */
332
- .card-content {
333
- display: flex;
334
- flex-direction: column;
335
- gap: 1.25rem;
336
- }
337
-
338
- .info-row {
339
- display: flex;
340
- justify-content: space-between;
341
- align-items: center;
342
- }
343
-
344
- .info-label {
345
- color: var(--text-secondary);
346
- font-size: 0.9rem;
347
- font-weight: 600;
348
- }
349
-
350
- .info-value {
351
- font-weight: 700;
352
- font-size: 1rem;
353
- color: var(--text-primary);
354
- }
355
-
356
- /* Status Badges */
357
- .status-badge {
358
- padding: 0.375rem 1rem;
359
- border-radius: 2rem;
360
- font-size: 0.75rem;
361
- font-weight: 800;
362
- text-transform: uppercase;
363
- letter-spacing: 0.05em;
364
- display: inline-flex;
365
- align-items: center;
366
- gap: 0.375rem;
367
- }
368
-
369
- .status-online {
370
- background: #d1fae5;
371
- color: #065f46;
372
- }
373
-
374
- .status-offline {
375
- background: #fee2e2;
376
- color: #991b1b;
377
- }
378
-
379
- /* Progress Bars - Thick & Glossy */
380
- .progress-container {
381
- width: 100%;
382
- margin-top: 0.5rem;
383
- }
384
-
385
- .progress-label {
386
- display: flex;
387
- justify-content: space-between;
388
- margin-bottom: 0.5rem;
389
- font-size: 0.875rem;
390
- font-weight: 700;
391
- color: var(--text-secondary);
392
- }
393
-
394
- .progress-bar-bg {
395
- width: 100%;
396
- height: 12px;
397
- background: #e2e8f0;
398
- border-radius: 1rem;
399
- overflow: hidden;
400
- box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.05);
401
- }
402
-
403
- .progress-bar-fill {
404
- height: 100%;
405
- background: linear-gradient(90deg, var(--primary), var(--accent), var(--primary));
406
- background-size: 200% 100%;
407
- border-radius: 1rem;
408
- width: 0%;
409
- transition: width 1.5s cubic-bezier(0.65, 0, 0.35, 1);
410
- position: relative;
411
- animation: shimmer 3s infinite linear;
412
- }
413
-
414
- @keyframes shimmer {
415
- 0% {
416
- background-position: 100% 0;
417
- }
418
-
419
- 100% {
420
- background-position: -100% 0;
421
- }
422
- }
423
-
424
- .progress-bar-fill::after {
425
- content: '';
426
- position: absolute;
427
- top: 0;
428
- left: 0;
429
- right: 0;
430
- bottom: 0;
431
- background: linear-gradient(rgba(255, 255, 255, 0.2), transparent);
432
- }
433
-
434
- /* Tables Section */
435
- .view-section {
436
- display: none;
437
- animation: slideUp 0.6s ease-out;
438
- }
439
-
440
- .view-section.active {
441
- display: block;
442
- }
443
-
444
- .apps-table {
445
- width: 100%;
446
- border-collapse: separate;
447
- border-spacing: 0;
448
- margin-top: 1rem;
449
- }
450
-
451
- .apps-table th {
452
- text-align: left;
453
- padding: 1.25rem 1rem;
454
- font-size: 0.85rem;
455
- font-weight: 700;
456
- text-transform: uppercase;
457
- letter-spacing: 0.05em;
458
- color: var(--text-muted);
459
- border-bottom: 2px solid var(--card-border);
460
- }
461
-
462
- .apps-table td {
463
- padding: 1.5rem 1rem;
464
- border-bottom: 1px solid var(--card-border);
465
- vertical-align: middle;
466
- }
467
-
468
- .apps-table tr:last-child td {
469
- border-bottom: none;
470
- }
471
-
472
- .apps-table tr:hover td {
473
- background: rgba(79, 70, 229, 0.02);
474
- }
475
-
476
- /* Action Buttons */
477
- .action-btn {
478
- width: 38px;
479
- height: 38px;
480
- background: #ffffff;
481
- border: 1px solid var(--card-border);
482
- color: var(--text-secondary);
483
- border-radius: 0.75rem;
484
- display: inline-flex;
485
- align-items: center;
486
- justify-content: center;
487
- cursor: pointer;
488
- transition: var(--transition);
489
- font-size: 1.25rem;
490
- box-shadow: var(--shadow-soft);
491
- }
492
-
493
- .action-btn:hover {
494
- background: var(--primary);
495
- color: #ffffff;
496
- border-color: var(--primary);
497
- transform: scale(1.1);
498
- box-shadow: 0 4px 12px rgba(79, 70, 229, 0.2);
499
- }
500
-
501
- .action-btn.restart-btn {
502
- background: var(--primary);
503
- color: #ffffff;
504
- border: none;
505
- padding: 0 1.25rem;
506
- width: auto;
507
- font-size: 0.9rem;
508
- font-weight: 700;
509
- gap: 0.5rem;
510
- }
511
-
512
- /* Console & Logs */
513
- .console-logs {
514
- margin-top: 1.5rem;
515
- background: #0f172a;
516
- color: #38bdf8;
517
- font-family: 'Fira Code', 'Monaco', 'Courier New', monospace;
518
- font-size: 0.85rem;
519
- padding: 1.25rem;
520
- border-radius: var(--radius-md);
521
- max-height: 250px;
522
- overflow-y: auto;
523
- border: 1px solid #1e293b;
524
- box-shadow: inset 0 4px 12px rgba(0, 0, 0, 0.2);
525
- line-height: 1.5;
526
- }
527
-
528
- /* Cloudflare Section Layout */
529
- .cloudflare-layout {
530
- display: grid;
531
- grid-template-columns: 400px 1fr;
532
- gap: 2rem;
533
- align-items: start;
534
- }
535
-
536
- @media (max-width: 1200px) {
537
- .cloudflare-layout {
538
- grid-template-columns: 1fr;
539
- }
540
- }
541
-
542
- .network-list {
543
- display: flex;
544
- flex-direction: column;
545
- gap: 1rem;
546
- overflow-y: auto;
547
- overflow-x: hidden;
548
- padding-right: 0.75rem;
549
- height: 600px;
550
- /* Fixed height for scrollable area */
551
- scroll-behavior: smooth;
552
- }
553
-
554
- .network-item {
555
- background: #ffffff;
556
- border: 1px solid var(--card-border);
557
- padding: 1.25rem 1.5rem;
558
- border-radius: var(--radius-md);
559
- transition: var(--transition);
560
- display: flex;
561
- justify-content: space-between;
562
- align-items: center;
563
- box-shadow: var(--shadow-soft);
564
- }
565
-
566
- .network-item .network-info {
567
- display: flex;
568
- align-items: center;
569
- gap: 1.25rem;
570
- }
571
-
572
- .network-item .host-text {
573
- font-weight: 700;
574
- font-size: 1rem;
575
- color: var(--text-primary);
576
- }
577
-
578
- .network-item .service-text {
579
- font-size: 0.85rem;
580
- color: var(--text-secondary);
581
- font-family: 'Fira Code', monospace;
582
- }
583
-
584
- .network-item:hover {
585
- border-color: var(--primary-light);
586
- transform: translateX(6px);
587
- box-shadow: var(--shadow-card);
588
- }
589
-
590
- .connect-btn {
591
- background: linear-gradient(135deg, #059669, #10b981);
592
- color: #ffffff;
593
- padding: 0.625rem 1.25rem;
594
- border-radius: 0.625rem;
595
- text-decoration: none;
596
- font-weight: 700;
597
- font-size: 0.85rem;
598
- transition: var(--transition);
599
- }
600
-
601
- .connect-btn:hover {
602
- box-shadow: 0 8px 15px -3px rgba(16, 185, 129, 0.3);
603
- transform: translateY(-2px);
604
- }
605
-
606
- /* Scrollbar Style */
607
- ::-webkit-scrollbar {
608
- width: 8px;
609
- height: 8px;
610
- }
611
-
612
- ::-webkit-scrollbar-track {
613
- background: transparent;
614
- }
615
-
616
- ::-webkit-scrollbar-thumb {
617
- background: #cbd5e1;
618
- border-radius: 10px;
619
- }
620
-
621
- ::-webkit-scrollbar-thumb:hover {
622
- background: #94a3b8;
623
- }
624
-
625
- /* Login & Forms - Premium Look */
626
- .login-container {
627
- height: 100vh;
628
- display: flex;
629
- justify-content: center;
630
- align-items: center;
631
- padding: 1.5rem;
632
- }
633
-
634
- .login-card {
635
- max-width: 450px;
636
- width: 100%;
637
- animation: slideUp 0.8s ease-out;
638
- }
639
-
640
- .login-header {
641
- text-align: center;
642
- justify-content: center;
643
- border: none;
644
- margin-bottom: 2rem;
645
- }
646
-
647
- .form-group {
648
- margin-bottom: 1.75rem;
649
- }
650
-
651
- .form-group label {
652
- display: block;
653
- margin-bottom: 0.625rem;
654
- font-weight: 700;
655
- font-size: 0.875rem;
656
- color: var(--text-secondary);
657
- }
658
-
659
- .input-wrapper {
660
- position: relative;
661
- display: flex;
662
- align-items: center;
663
- }
664
-
665
- .input-wrapper ion-icon {
666
- position: absolute;
667
- left: 1.125rem;
668
- font-size: 1.25rem;
669
- color: var(--text-muted);
670
- pointer-events: none;
671
- }
672
-
673
- .input-wrapper input {
674
- width: 100%;
675
- padding: 0.875rem 1rem 0.875rem 3rem;
676
- background: #ffffff;
677
- border: 1px solid var(--card-border);
678
- border-radius: var(--radius-md);
679
- font-family: inherit;
680
- font-size: 1rem;
681
- color: var(--text-primary);
682
- transition: var(--transition);
683
- box-shadow: var(--shadow-soft);
684
- }
685
-
686
- .input-wrapper input:focus {
687
- outline: none;
688
- border-color: var(--primary);
689
- box-shadow: 0 0 0 4px rgba(79, 70, 229, 0.1);
690
- }
691
-
692
- .login-btn,
693
- .action-btn.connect-btn {
694
- width: 100%;
695
- padding: 0.875rem;
696
- background: linear-gradient(135deg, var(--primary), var(--secondary));
697
- color: #ffffff;
698
- border: none;
699
- border-radius: var(--radius-md);
700
- font-size: 1rem;
701
- font-weight: 800;
702
- cursor: pointer;
703
- display: flex;
704
- justify-content: center;
705
- align-items: center;
706
- gap: 0.75rem;
707
- transition: var(--transition);
708
- box-shadow: 0 10px 15px -3px rgba(79, 70, 229, 0.25);
709
- }
710
-
711
- .login-btn:hover {
712
- transform: translateY(-2px);
713
- box-shadow: 0 20px 25px -5px rgba(79, 70, 229, 0.3);
714
- filter: brightness(1.1);
715
- }
716
-
717
- .error-message {
718
- background: #fee2e2;
719
- color: #991b1b;
720
- padding: 0.75rem 1rem;
721
- border-radius: var(--radius-md);
722
- font-size: 0.875rem;
723
- font-weight: 600;
724
- margin-bottom: 1.5rem;
725
- display: none;
726
- animation: fadeIn 0.3s ease;
727
- }
728
-
729
- .error-message:not(:empty) {
730
- display: block;
731
- }
732
-
733
- .dark-input {
734
- background: #ffffff;
735
- border: 1px solid var(--card-border);
736
- border-radius: var(--radius-md);
737
- padding: 0.75rem 1rem;
738
- color: var(--text-primary);
739
- font-family: inherit;
740
- font-size: 0.95rem;
741
- transition: var(--transition);
742
- }
743
-
744
- .dark-input:focus {
745
- outline: none;
746
- border-color: var(--primary);
747
- box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.1);
748
- }
749
-
750
- /* Responsive Overrides */
751
- @media (max-width: 1024px) {
752
- .sidebar {
753
- width: 80px;
754
- padding: 2rem 1rem;
755
- }
756
-
757
- .sidebar h2 span,
758
- .nav-link span {
759
- display: none;
760
- }
761
-
762
- .main-content {
763
- padding: 2rem;
764
- }
765
- }
766
-
767
- @media (max-width: 768px) {
768
- .app-layout {
769
- flex-direction: column;
770
- overflow-x: hidden;
771
- }
772
-
773
- .sidebar {
774
- width: 100%;
775
- height: auto;
776
- position: sticky;
777
- top: 0;
778
- z-index: 1000;
779
- padding: 1rem 1.5rem;
780
- box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
781
- }
782
-
783
- .nav-links {
784
- display: flex;
785
- gap: 0.5rem;
786
- overflow-x: auto;
787
- padding-bottom: 0.5rem;
788
- -webkit-overflow-scrolling: touch;
789
- }
790
-
791
- .nav-link {
792
- white-space: nowrap;
793
- padding: 0.625rem 1rem;
794
- }
795
-
796
- .main-content {
797
- padding: 1.5rem;
798
- width: 100%;
799
- overflow: visible;
800
- }
801
-
802
- .views-container {
803
- overflow: visible;
804
- height: auto;
805
- }
806
-
807
- header {
808
- margin-bottom: 2rem;
809
- }
810
-
811
- header div {
812
- flex-direction: column;
813
- align-items: flex-start !important;
814
- gap: 1rem;
815
- }
816
-
817
- header h1 {
818
- font-size: 1.75rem;
819
- }
820
-
821
- /* Mobile Card Transformation for Tables */
822
- .apps-table,
823
- .apps-table thead,
824
- .apps-table tbody,
825
- .apps-table th,
826
- .apps-table td,
827
- .apps-table tr {
828
- display: block;
829
- }
830
-
831
- .apps-table thead tr {
832
- position: absolute;
833
- top: -9999px;
834
- left: -9999px;
835
- }
836
-
837
- .apps-table tr {
838
- border: 1px solid var(--card-border);
839
- border-radius: var(--radius-md);
840
- margin-bottom: 1.5rem;
841
- background: #ffffff;
842
- box-shadow: var(--shadow-soft);
843
- padding: 0.5rem;
844
- }
845
-
846
- .apps-table td {
847
- border: none;
848
- border-bottom: 1px solid rgba(0, 0, 0, 0.03);
849
- position: relative;
850
- padding-left: 50% !important;
851
- text-align: right;
852
- min-height: 3rem;
853
- display: flex;
854
- align-items: center;
855
- justify-content: flex-end;
856
- }
857
-
858
- .apps-table td:last-child {
859
- border-bottom: none;
860
- }
861
-
862
- .apps-table td::before {
863
- content: attr(data-label);
864
- position: absolute;
865
- left: 1rem;
866
- width: 45%;
867
- padding-right: 10px;
868
- white-space: nowrap;
869
- text-align: left;
870
- font-weight: 800;
871
- color: var(--text-muted);
872
- text-transform: uppercase;
873
- font-size: 0.7rem;
874
- }
875
-
876
- .apps-table td[data-label="Actions"] {
877
- justify-content: center;
878
- padding-left: 1rem !important;
879
- background: rgba(79, 70, 229, 0.03);
880
- border-radius: 0 0 var(--radius-md) var(--radius-md);
881
- }
882
-
883
- .apps-table td[data-label="Actions"]::before {
884
- display: none;
885
- }
886
-
887
- /* Mobile Card Transformation for Network/Cloudflare Items */
888
- .network-list {
889
- height: auto;
890
- max-height: none;
891
- /* Allow natural expansion on mobile */
892
- overflow-y: visible;
893
- /* Use main page scroll for better mobile UX */
894
- padding-right: 0;
895
- }
896
-
897
- .card {
898
- padding: 1.25rem;
899
- overflow: visible;
900
- /* Prevent clipping of card shadows or dropdowns */
901
- }
902
-
903
- .card-content {
904
- overflow: visible;
905
- }
906
-
907
- .dashboard-grid {
908
- grid-template-columns: 1fr;
909
- /* Force full width on mobile */
910
- }
911
-
912
- .network-item {
913
- flex-direction: column;
914
- align-items: stretch;
915
- gap: 1.25rem;
916
- padding: 1.5rem;
917
- background: #ffffff;
918
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
919
- border: 1px solid var(--card-border);
920
- border-left: 4px solid var(--primary);
921
- position: relative;
922
- overflow: hidden;
923
- }
924
-
925
- .network-info {
926
- gap: 1rem;
927
- align-items: flex-start;
928
- }
929
-
930
- .network-info ion-icon {
931
- font-size: 1.8rem !important;
932
- background: rgba(79, 70, 229, 0.1);
933
- padding: 0.5rem;
934
- border-radius: var(--radius-sm);
935
- }
936
-
937
- .host-text,
938
- .server-ip {
939
- font-size: 1.15rem;
940
- font-weight: 800;
941
- color: var(--text-main);
942
- word-break: break-all;
943
- margin-bottom: 0.25rem;
944
- }
945
-
946
- .service-text,
947
- .server-status {
948
- font-size: 0.9rem;
949
- color: var(--text-secondary);
950
- font-family: 'Fira Code', monospace;
951
- letter-spacing: -0.5px;
952
- }
953
-
954
- .network-item .action-btn:active {
955
- transform: scale(0.95);
956
- background: rgba(79, 70, 229, 0.05);
957
- }
958
-
959
- /* Target both Cloudflare and Network Scan containers explicitly */
960
- .network-item>.mobile-actions,
961
- .network-item>.connect-btn {
962
- margin-top: 1.25rem;
963
- padding-top: 1.25rem;
964
- border-top: 1px dashed rgba(0, 0, 0, 0.1);
965
- display: grid !important;
966
- grid-template-columns: repeat(3, 1fr) !important;
967
- width: calc(100% + 3rem);
968
- /* Expand to full width of padded card */
969
- gap: 0.75rem;
970
- background: rgba(0, 0, 0, 0.02);
971
- margin: 1.25rem -1.5rem -1.5rem -1.5rem;
972
- padding: 1.25rem 1.5rem;
973
- }
974
-
975
- /* Single button (Network Scan) style upgrade */
976
- .network-item>.connect-btn {
977
- grid-template-columns: 1fr !important;
978
- text-decoration: none;
979
- background: linear-gradient(135deg, var(--primary), var(--secondary)) !important;
980
- box-shadow: 0 4px 15px rgba(79, 70, 229, 0.3);
981
- border: none;
982
- height: 58px;
983
- display: flex;
984
- font-weight: 800;
985
- letter-spacing: 1px;
986
- text-transform: uppercase;
987
- font-size: 0.95rem;
988
- justify-content: center;
989
- align-items: center;
990
- color: #ffffff !important;
991
- border-radius: 0 0 calc(var(--radius-lg) - 1px) calc(var(--radius-lg) - 1px);
992
- gap: 0.75rem;
993
- transition: all 0.3s ease;
994
- }
995
-
996
- .network-item .action-btn {
997
- font-size: 1.5rem;
998
- height: 54px;
999
- background: #ffffff;
1000
- border: 1px solid var(--card-border);
1001
- border-radius: var(--radius-md);
1002
- display: flex;
1003
- align-items: center;
1004
- justify-content: center;
1005
- transition: all 0.2s;
1006
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.02);
1007
- }
1008
-
1009
- .network-item .connect-btn ion-icon {
1010
- font-size: 1.4rem;
1011
- transition: transform 0.3s ease;
1012
- }
1013
-
1014
- .network-item .connect-btn:active {
1015
- transform: scale(0.98);
1016
- filter: brightness(1.1);
1017
- box-shadow: 0 2px 8px rgba(79, 70, 229, 0.4);
1018
- }
1019
-
1020
- .network-item .connect-btn:active ion-icon {
1021
- transform: translateX(8px);
1022
- }
1023
-
1024
- /* Form Grid Fix for Mobile */
1025
- .config-form div[style*="display: grid"] {
1026
- grid-template-columns: 1fr !important;
1027
- gap: 1rem !important;
1028
- }
1029
- }
1030
-
1031
- /* Spin Animation */
1032
- @keyframes spin {
1033
- 0% {
1034
- transform: rotate(0deg);
1035
- }
1036
-
1037
- 100% {
1038
- transform: rotate(360deg);
1039
- }
1040
- }
1041
-
1042
- .spin {
1043
- animation: spin 1s linear infinite;
1044
- display: inline-block;
1045
- }