CSS · 11195 bytes Raw Blame History
1 /* LooseCannon Analytics Dashboard Styles */
2
3 :root {
4 --bg-primary: #0f0f0f;
5 --bg-secondary: #1a1a1a;
6 --bg-card: #242424;
7 --text-primary: #e0e0e0;
8 --text-secondary: #888;
9 --accent: #667eea;
10 --success: #10b981;
11 --danger: #ef4444;
12 --warning: #f59e0b;
13 --info: #3b82f6;
14 --border: #333;
15 }
16
17 * {
18 margin: 0;
19 padding: 0;
20 box-sizing: border-box;
21 }
22
23 body {
24 font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, monospace;
25 background: var(--bg-primary);
26 color: var(--text-primary);
27 line-height: 1.6;
28 }
29
30 /* Dashboard Layout */
31 .dashboard {
32 min-height: 100vh;
33 display: flex;
34 flex-direction: column;
35 }
36
37 /* Header */
38 .dashboard-header {
39 background: var(--bg-secondary);
40 border-bottom: 1px solid var(--border);
41 padding: 1.5rem 2rem;
42 position: sticky;
43 top: 0;
44 z-index: 100;
45 }
46
47 .header-content {
48 display: flex;
49 justify-content: space-between;
50 align-items: center;
51 max-width: 1400px;
52 margin: 0 auto;
53 }
54
55 .dashboard-header h1 {
56 font-size: 1.8rem;
57 font-weight: 600;
58 background: linear-gradient(135deg, var(--accent), #764ba2);
59 -webkit-background-clip: text;
60 -webkit-text-fill-color: transparent;
61 }
62
63 .server-status {
64 display: flex;
65 align-items: center;
66 gap: 0.5rem;
67 font-size: 0.9rem;
68 color: var(--text-secondary);
69 }
70
71 .status-indicator {
72 width: 10px;
73 height: 10px;
74 border-radius: 50%;
75 background: var(--danger);
76 animation: pulse 2s infinite;
77 }
78
79 .status-indicator.connected {
80 background: var(--success);
81 }
82
83 /* Main Content */
84 .dashboard-main {
85 flex: 1;
86 padding: 2rem;
87 max-width: 1400px;
88 margin: 0 auto;
89 width: 100%;
90 }
91
92 /* Stats Grid */
93 .stats-grid {
94 display: grid;
95 grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
96 gap: 1.5rem;
97 margin-bottom: 2rem;
98 }
99
100 .stat-card {
101 background: var(--bg-card);
102 border: 1px solid var(--border);
103 border-radius: 12px;
104 padding: 1.5rem;
105 transition: transform 0.2s, border-color 0.2s;
106 }
107
108 .stat-card:hover {
109 transform: translateY(-2px);
110 border-color: var(--accent);
111 }
112
113 .stat-card.danger {
114 border-color: var(--danger);
115 }
116
117 .stat-card.success {
118 border-color: var(--success);
119 }
120
121 .stat-card.info {
122 border-color: var(--info);
123 }
124
125 .stat-value {
126 font-size: 2.5rem;
127 font-weight: bold;
128 margin-bottom: 0.5rem;
129 }
130
131 .stat-label {
132 color: var(--text-secondary);
133 font-size: 0.9rem;
134 text-transform: uppercase;
135 letter-spacing: 1px;
136 }
137
138 .stat-trend {
139 margin-top: 0.5rem;
140 font-size: 0.85rem;
141 color: var(--success);
142 }
143
144 .stat-trend.negative {
145 color: var(--danger);
146 }
147
148 .stat-indicator {
149 display: flex;
150 align-items: center;
151 gap: 0.5rem;
152 margin-top: 0.5rem;
153 font-size: 0.85rem;
154 }
155
156 .pulse {
157 width: 8px;
158 height: 8px;
159 background: var(--success);
160 border-radius: 50%;
161 animation: pulse 1.5s infinite;
162 }
163
164 /* Activity Feed */
165 .activity-section {
166 background: var(--bg-card);
167 border: 1px solid var(--border);
168 border-radius: 12px;
169 padding: 1.5rem;
170 margin-bottom: 2rem;
171 }
172
173 .activity-section h2 {
174 margin-bottom: 1rem;
175 font-size: 1.2rem;
176 color: var(--text-primary);
177 }
178
179 .activity-feed {
180 max-height: 300px;
181 overflow-y: auto;
182 space-y: 0.5rem;
183 }
184
185 .activity-item {
186 display: flex;
187 gap: 1rem;
188 padding: 0.75rem;
189 background: var(--bg-secondary);
190 border-radius: 8px;
191 margin-bottom: 0.5rem;
192 font-size: 0.9rem;
193 }
194
195 .activity-time {
196 color: var(--text-secondary);
197 min-width: 80px;
198 }
199
200 .activity-message {
201 flex: 1;
202 }
203
204 .activity-item.scammer {
205 border-left: 3px solid var(--danger);
206 }
207
208 .activity-item.success {
209 border-left: 3px solid var(--success);
210 }
211
212 /* Charts Section */
213 .charts-section {
214 display: grid;
215 grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
216 gap: 1.5rem;
217 margin-bottom: 2rem;
218 }
219
220 .chart-container {
221 background: var(--bg-card);
222 border: 1px solid var(--border);
223 border-radius: 12px;
224 padding: 1.5rem;
225 }
226
227 .chart-container h3 {
228 margin-bottom: 1rem;
229 font-size: 1rem;
230 color: var(--text-primary);
231 }
232
233 .chart-container canvas {
234 max-height: 250px;
235 }
236
237 /* Conversations */
238 .conversations-section {
239 background: var(--bg-card);
240 border: 1px solid var(--border);
241 border-radius: 12px;
242 padding: 1.5rem;
243 margin-bottom: 2rem;
244 }
245
246 .conversations-section h2 {
247 margin-bottom: 1rem;
248 font-size: 1.2rem;
249 }
250
251 .conversations-grid {
252 display: grid;
253 grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
254 gap: 1rem;
255 }
256
257 .conversation-card {
258 background: var(--bg-secondary);
259 border: 1px solid var(--border);
260 border-radius: 8px;
261 padding: 1rem;
262 transition: border-color 0.2s;
263 }
264
265 .conversation-card:hover {
266 border-color: var(--accent);
267 cursor: pointer;
268 }
269
270 .conversation-header {
271 display: flex;
272 justify-content: space-between;
273 align-items: center;
274 margin-bottom: 0.75rem;
275 }
276
277 .platform-badge {
278 padding: 0.25rem 0.5rem;
279 border-radius: 4px;
280 font-size: 0.75rem;
281 text-transform: uppercase;
282 font-weight: bold;
283 }
284
285 .platform-badge.whatsapp {
286 background: #25d366;
287 color: white;
288 }
289
290 .platform-badge.telegram {
291 background: #0088cc;
292 color: white;
293 }
294
295 .platform-badge.messenger {
296 background: #0084ff;
297 color: white;
298 }
299
300 .conversation-id {
301 font-size: 0.85rem;
302 color: var(--text-secondary);
303 }
304
305 .conversation-stats {
306 display: flex;
307 gap: 1rem;
308 font-size: 0.85rem;
309 color: var(--text-secondary);
310 }
311
312 /* Evidence Section */
313 .evidence-section {
314 background: var(--bg-card);
315 border: 1px solid var(--border);
316 border-radius: 12px;
317 padding: 1.5rem;
318 margin-bottom: 2rem;
319 }
320
321 .evidence-section h2 {
322 margin-bottom: 1rem;
323 }
324
325 .evidence-grid {
326 display: grid;
327 grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
328 gap: 1rem;
329 }
330
331 .evidence-item {
332 position: relative;
333 border: 1px solid var(--border);
334 border-radius: 8px;
335 overflow: hidden;
336 cursor: pointer;
337 transition: transform 0.2s;
338 }
339
340 .evidence-item:hover {
341 transform: scale(1.05);
342 }
343
344 .evidence-item img {
345 width: 100%;
346 height: 150px;
347 object-fit: cover;
348 }
349
350 .evidence-meta {
351 position: absolute;
352 bottom: 0;
353 left: 0;
354 right: 0;
355 background: rgba(0, 0, 0, 0.8);
356 padding: 0.5rem;
357 font-size: 0.75rem;
358 color: white;
359 }
360
361 .evidence-placeholder {
362 grid-column: 1 / -1;
363 text-align: center;
364 color: var(--text-secondary);
365 padding: 2rem;
366 }
367
368 /* Patterns Section */
369 .patterns-section {
370 background: var(--bg-card);
371 border: 1px solid var(--border);
372 border-radius: 12px;
373 padding: 1.5rem;
374 margin-bottom: 2rem;
375 }
376
377 .patterns-container {
378 display: grid;
379 grid-template-columns: 200px 1fr;
380 gap: 2rem;
381 }
382
383 .pattern-stats {
384 display: flex;
385 flex-direction: column;
386 gap: 1rem;
387 }
388
389 .pattern-stat {
390 text-align: center;
391 padding: 1rem;
392 background: var(--bg-secondary);
393 border-radius: 8px;
394 }
395
396 .pattern-value {
397 display: block;
398 font-size: 2rem;
399 font-weight: bold;
400 color: var(--accent);
401 }
402
403 .pattern-label {
404 display: block;
405 font-size: 0.8rem;
406 color: var(--text-secondary);
407 margin-top: 0.25rem;
408 }
409
410 .patterns-list {
411 max-height: 200px;
412 overflow-y: auto;
413 }
414
415 .pattern-item {
416 display: flex;
417 justify-content: space-between;
418 padding: 0.75rem;
419 background: var(--bg-secondary);
420 border-radius: 6px;
421 margin-bottom: 0.5rem;
422 }
423
424 .pattern-type {
425 font-weight: 500;
426 }
427
428 .pattern-count {
429 color: var(--text-secondary);
430 font-size: 0.9rem;
431 }
432
433 /* Controls */
434 .controls-section {
435 background: var(--bg-card);
436 border: 1px solid var(--border);
437 border-radius: 12px;
438 padding: 1.5rem;
439 margin-bottom: 2rem;
440 }
441
442 .controls-grid {
443 display: grid;
444 grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
445 gap: 1rem;
446 }
447
448 .control-btn {
449 padding: 0.75rem 1.5rem;
450 border: 1px solid var(--border);
451 border-radius: 8px;
452 background: var(--bg-secondary);
453 color: var(--text-primary);
454 font-size: 0.9rem;
455 cursor: pointer;
456 transition: all 0.2s;
457 }
458
459 .control-btn:hover {
460 transform: translateY(-2px);
461 border-color: var(--accent);
462 }
463
464 .control-btn.primary {
465 background: var(--accent);
466 color: white;
467 border-color: var(--accent);
468 }
469
470 .control-btn.danger {
471 background: var(--danger);
472 color: white;
473 border-color: var(--danger);
474 }
475
476 .control-btn.success {
477 background: var(--success);
478 color: white;
479 border-color: var(--success);
480 }
481
482 .control-btn.info {
483 background: var(--info);
484 color: white;
485 border-color: var(--info);
486 }
487
488 /* Modal */
489 .modal {
490 display: none;
491 position: fixed;
492 top: 0;
493 left: 0;
494 right: 0;
495 bottom: 0;
496 background: rgba(0, 0, 0, 0.8);
497 z-index: 1000;
498 align-items: center;
499 justify-content: center;
500 }
501
502 .modal.active {
503 display: flex;
504 }
505
506 .modal-content {
507 background: var(--bg-card);
508 border: 1px solid var(--border);
509 border-radius: 12px;
510 width: 90%;
511 max-width: 600px;
512 max-height: 80vh;
513 overflow: auto;
514 }
515
516 .modal-header {
517 display: flex;
518 justify-content: space-between;
519 align-items: center;
520 padding: 1.5rem;
521 border-bottom: 1px solid var(--border);
522 }
523
524 .modal-close {
525 background: none;
526 border: none;
527 color: var(--text-secondary);
528 font-size: 1.5rem;
529 cursor: pointer;
530 }
531
532 .modal-body {
533 padding: 1.5rem;
534 }
535
536 /* Forms */
537 .form-group {
538 margin-bottom: 1.5rem;
539 }
540
541 .form-group label {
542 display: block;
543 margin-bottom: 0.5rem;
544 color: var(--text-primary);
545 font-size: 0.9rem;
546 }
547
548 .form-group input,
549 .form-group textarea,
550 .form-group select {
551 width: 100%;
552 padding: 0.75rem;
553 background: var(--bg-secondary);
554 border: 1px solid var(--border);
555 border-radius: 6px;
556 color: var(--text-primary);
557 font-size: 0.9rem;
558 }
559
560 .form-group input:focus,
561 .form-group textarea:focus {
562 outline: none;
563 border-color: var(--accent);
564 }
565
566 .form-buttons {
567 display: flex;
568 gap: 1rem;
569 justify-content: flex-end;
570 }
571
572 .btn {
573 padding: 0.75rem 1.5rem;
574 border: 1px solid var(--border);
575 border-radius: 6px;
576 background: var(--bg-secondary);
577 color: var(--text-primary);
578 cursor: pointer;
579 transition: all 0.2s;
580 }
581
582 .btn.primary {
583 background: var(--accent);
584 color: white;
585 border-color: var(--accent);
586 }
587
588 .btn.secondary {
589 background: var(--bg-secondary);
590 color: var(--text-primary);
591 }
592
593 /* Footer */
594 .dashboard-footer {
595 background: var(--bg-secondary);
596 border-top: 1px solid var(--border);
597 padding: 1rem 2rem;
598 margin-top: auto;
599 }
600
601 .footer-content {
602 display: flex;
603 justify-content: space-between;
604 align-items: center;
605 max-width: 1400px;
606 margin: 0 auto;
607 font-size: 0.85rem;
608 color: var(--text-secondary);
609 }
610
611 /* Animations */
612 @keyframes pulse {
613 0% {
614 box-shadow: 0 0 0 0 currentColor;
615 opacity: 1;
616 }
617 70% {
618 box-shadow: 0 0 0 10px currentColor;
619 opacity: 0;
620 }
621 100% {
622 box-shadow: 0 0 0 0 currentColor;
623 opacity: 0;
624 }
625 }
626
627 /* Scrollbar */
628 ::-webkit-scrollbar {
629 width: 8px;
630 height: 8px;
631 }
632
633 ::-webkit-scrollbar-track {
634 background: var(--bg-secondary);
635 }
636
637 ::-webkit-scrollbar-thumb {
638 background: var(--border);
639 border-radius: 4px;
640 }
641
642 ::-webkit-scrollbar-thumb:hover {
643 background: var(--accent);
644 }
645
646 /* Responsive */
647 @media (max-width: 768px) {
648 .dashboard-main {
649 padding: 1rem;
650 }
651
652 .stats-grid {
653 grid-template-columns: 1fr;
654 }
655
656 .charts-section {
657 grid-template-columns: 1fr;
658 }
659
660 .conversations-grid {
661 grid-template-columns: 1fr;
662 }
663
664 .patterns-container {
665 grid-template-columns: 1fr;
666 }
667
668 .footer-content {
669 flex-direction: column;
670 gap: 0.5rem;
671 text-align: center;
672 }
673 }