krsyer-server-monitor-pro 1.0.31 → 1.0.33

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.
@@ -0,0 +1,1045 @@
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
+ }