detecti-cli 2.0.0__py3-none-any.whl

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.
Files changed (64) hide show
  1. detecti/__init__.py +0 -0
  2. detecti/cli.py +649 -0
  3. detecti/config.py +188 -0
  4. detecti/core/__init__.py +1 -0
  5. detecti/core/database/__init__.py +5 -0
  6. detecti/core/database/config_db.py +73 -0
  7. detecti/core/database/schema.py +136 -0
  8. detecti/core/database/storage.py +1388 -0
  9. detecti/core/engine.py +1032 -0
  10. detecti/core/models.py +278 -0
  11. detecti/data/config.sqlite +0 -0
  12. detecti/data/dbs/.gitkeep +2 -0
  13. detecti/data/dbs/example.com.sqlite +0 -0
  14. detecti/modules/__init__.py +29 -0
  15. detecti/modules/base.py +57 -0
  16. detecti/modules/censys.py +813 -0
  17. detecti/modules/crtsh.py +98 -0
  18. detecti/modules/exploitdb.py +138 -0
  19. detecti/modules/masscan.py +561 -0
  20. detecti/modules/nuclei.py +449 -0
  21. detecti/modules/nvd.py +300 -0
  22. detecti/modules/reverse_whois.py +225 -0
  23. detecti/modules/shodan.py +412 -0
  24. detecti/reporters/__init__.py +7 -0
  25. detecti/reporters/csv_reporter.py +74 -0
  26. detecti/reporters/html_reporter.py +356 -0
  27. detecti/reporters/json_reporter.py +26 -0
  28. detecti/reporters/markdown_reporter.py +203 -0
  29. detecti/utils/__init__.py +1 -0
  30. detecti/utils/http.py +294 -0
  31. detecti/utils/logger.py +378 -0
  32. detecti/utils/setup.py +453 -0
  33. detecti/web/__init__.py +6 -0
  34. detecti/web/api/__init__.py +1 -0
  35. detecti/web/api/auth.py +109 -0
  36. detecti/web/api/graph_builder.py +901 -0
  37. detecti/web/api/routes.py +1602 -0
  38. detecti/web/process_manager.py +283 -0
  39. detecti/web/server.py +183 -0
  40. detecti/web/static/android-chrome-192x192.png +0 -0
  41. detecti/web/static/android-chrome-512x512.png +0 -0
  42. detecti/web/static/apple-touch-icon.png +0 -0
  43. detecti/web/static/css/__init__.py +1 -0
  44. detecti/web/static/css/dashboard.css +3802 -0
  45. detecti/web/static/favicon-16x16.png +0 -0
  46. detecti/web/static/favicon-32x32.png +0 -0
  47. detecti/web/static/favicon.ico +0 -0
  48. detecti/web/static/img/DetecTI_Security_Logo.png +0 -0
  49. detecti/web/static/img/detecti-ico.png +0 -0
  50. detecti/web/static/index.html +677 -0
  51. detecti/web/static/js/__init__.py +1 -0
  52. detecti/web/static/js/api.js +177 -0
  53. detecti/web/static/js/cytoscape-cose-bilkent.js +458 -0
  54. detecti/web/static/js/cytoscape-dagre.js +397 -0
  55. detecti/web/static/js/cytoscape.min.js +31 -0
  56. detecti/web/static/js/dagre.min.js +3809 -0
  57. detecti/web/static/js/graph.js +7439 -0
  58. detecti/web/static/js/lucide.min.js +12 -0
  59. detecti/web/static/login.html +290 -0
  60. detecti/web/static/site.webmanifest +1 -0
  61. detecti_cli-2.0.0.dist-info/METADATA +554 -0
  62. detecti_cli-2.0.0.dist-info/RECORD +64 -0
  63. detecti_cli-2.0.0.dist-info/WHEEL +4 -0
  64. detecti_cli-2.0.0.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,3802 @@
1
+ /* ==========================================================================
2
+ DetecTI-CLI — EASM & Threat Intelligence Dashboard Stylesheet
3
+ Aligned with DetecTI Security Official Website Design System & Visual Identity
4
+ ========================================================================== */
5
+
6
+ :root {
7
+ /* Color Palette */
8
+ --bg-primary: #0D0E12;
9
+ --bg-secondary: #14151D;
10
+ --bg-card: #191B26;
11
+ --bg-card-hover: #1F2230;
12
+ --bg-header: rgba(13, 14, 18, 0.88);
13
+
14
+ /* Core Brand Accents */
15
+ --purple-electric: #8C52FF;
16
+ --purple-primary: #7C3AED;
17
+ --purple-light: #a78bfa;
18
+ --purple-glow: rgba(140, 82, 255, 0.28);
19
+ --purple-glow-intense: rgba(140, 82, 255, 0.5);
20
+ --navy-deep: #0C184B;
21
+ --cyan-accent: #00e5ff;
22
+ --cyan-glow: rgba(0, 229, 255, 0.25);
23
+
24
+ /* Text Colors */
25
+ --text-primary: #F3F4F6;
26
+ --text-secondary: #9CA3AF;
27
+ --text-muted: #6B7280;
28
+ --text-white: #FFFFFF;
29
+
30
+ /* Borders & Glassmorphism */
31
+ --border-color: rgba(140, 82, 255, 0.18);
32
+ --border-hover: rgba(140, 82, 255, 0.45);
33
+ --border-cyan: rgba(0, 229, 255, 0.3);
34
+ --border-card: rgba(140, 82, 255, 0.14);
35
+
36
+ /* Code & Data */
37
+ --code-bg: #090A0D;
38
+ --font-main: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
39
+ --font-mono: 'JetBrains Mono', monospace, Consolas, Courier;
40
+
41
+ /* Risk Levels */
42
+ --risk-critical: #dc143c;
43
+ --risk-high: #ff6b6b;
44
+ --risk-medium: #ffa502;
45
+ --risk-low: #2ed573;
46
+ }
47
+
48
+ /* Reset & Global */
49
+ * {
50
+ margin: 0;
51
+ padding: 0;
52
+ box-sizing: border-box;
53
+ scrollbar-width: thin;
54
+ scrollbar-color: rgba(140, 82, 255, 0.3) transparent;
55
+ }
56
+
57
+ /* Custom Scrollbars (WebKit & Chromium) */
58
+ ::-webkit-scrollbar {
59
+ width: 6px;
60
+ height: 6px;
61
+ }
62
+
63
+ ::-webkit-scrollbar-track {
64
+ background: transparent;
65
+ }
66
+
67
+ ::-webkit-scrollbar-thumb {
68
+ background: rgba(140, 82, 255, 0.25);
69
+ border-radius: 9999px;
70
+ transition: background 0.2s ease;
71
+ }
72
+
73
+ ::-webkit-scrollbar-thumb:hover {
74
+ background: var(--purple-electric);
75
+ }
76
+
77
+ html, body {
78
+ width: 100%;
79
+ height: 100%;
80
+ font-family: var(--font-main);
81
+ background: var(--bg-primary);
82
+ color: var(--text-primary);
83
+ overflow: hidden;
84
+ touch-action: manipulation;
85
+ -webkit-font-smoothing: antialiased;
86
+ -moz-osx-font-smoothing: grayscale;
87
+ }
88
+
89
+ .dashboard-container {
90
+ display: flex;
91
+ flex-direction: column;
92
+ height: 100vh;
93
+ height: 100dvh;
94
+ width: 100vw;
95
+ overflow: hidden;
96
+ position: relative;
97
+ background: var(--bg-primary);
98
+ }
99
+
100
+ /* ==========================================================================
101
+ Header & Navigation
102
+ ========================================================================== */
103
+
104
+ .dashboard-header {
105
+ background: var(--bg-header);
106
+ backdrop-filter: blur(14px);
107
+ -webkit-backdrop-filter: blur(14px);
108
+ border-bottom: 1px solid var(--border-color);
109
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.4), 0 0 15px rgba(140, 82, 255, 0.08);
110
+ position: relative;
111
+ z-index: 100;
112
+ flex-shrink: 0;
113
+ }
114
+
115
+ .header-accent-bar {
116
+ height: 3px;
117
+ width: 100%;
118
+ background: linear-gradient(90deg, #8C52FF 0%, #0C184B 50%, #00e5ff 100%);
119
+ }
120
+
121
+ .header-content {
122
+ display: flex;
123
+ justify-content: space-between;
124
+ align-items: center;
125
+ width: 100%;
126
+ padding: 0.75rem 1.5rem;
127
+ gap: 1rem;
128
+ }
129
+
130
+ .header-left {
131
+ display: flex;
132
+ align-items: center;
133
+ gap: 0.85rem;
134
+ min-width: 0;
135
+ }
136
+
137
+ .sidebar-toggle-btn {
138
+ display: inline-flex;
139
+ align-items: center;
140
+ justify-content: center;
141
+ background: var(--bg-card);
142
+ border: 1px solid var(--border-color);
143
+ color: var(--purple-light);
144
+ width: 36px;
145
+ height: 36px;
146
+ padding: 0;
147
+ border-radius: 8px;
148
+ font-size: 1.1rem;
149
+ font-weight: 600;
150
+ cursor: pointer;
151
+ transition: all 0.2s ease;
152
+ flex-shrink: 0;
153
+ touch-action: manipulation;
154
+ }
155
+
156
+ .sidebar-toggle-btn:hover, .sidebar-toggle-btn:active {
157
+ background: var(--purple-electric);
158
+ border-color: var(--purple-electric);
159
+ color: var(--text-white);
160
+ box-shadow: 0 0 14px var(--purple-glow-intense);
161
+ transform: translateY(-1px);
162
+ }
163
+
164
+ /* Lucide Icon Helpers */
165
+ .ui-icon {
166
+ width: 16px;
167
+ height: 16px;
168
+ stroke-width: 2px;
169
+ vertical-align: middle;
170
+ display: inline-block;
171
+ flex-shrink: 0;
172
+ }
173
+
174
+ .sidebar-toggle-btn .ui-icon {
175
+ width: 18px;
176
+ height: 18px;
177
+ }
178
+
179
+ .label-icon {
180
+ width: 14px;
181
+ height: 14px;
182
+ margin-right: 2px;
183
+ color: var(--purple-light);
184
+ }
185
+
186
+ .panel-title-icon {
187
+ width: 16px;
188
+ height: 16px;
189
+ margin-right: 6px;
190
+ color: var(--purple-electric);
191
+ vertical-align: -2px;
192
+ }
193
+
194
+ .search-lead-icon {
195
+ position: absolute;
196
+ left: 0.85rem;
197
+ width: 16px;
198
+ height: 16px;
199
+ color: var(--text-muted);
200
+ pointer-events: none;
201
+ }
202
+
203
+ .header-brand {
204
+ display: flex;
205
+ align-items: center;
206
+ gap: 0.75rem;
207
+ min-width: 0;
208
+ text-decoration: none;
209
+ cursor: pointer;
210
+ transition: opacity 0.2s ease, transform 0.2s ease;
211
+ }
212
+
213
+ .header-brand:hover {
214
+ opacity: 0.95;
215
+ }
216
+
217
+ .brand-logo {
218
+ width: 34px;
219
+ height: 34px;
220
+ border-radius: 8px;
221
+ border: 1px solid var(--border-color);
222
+ flex-shrink: 0;
223
+ transition: all 0.25s ease;
224
+ }
225
+
226
+ .header-brand:hover .brand-logo {
227
+ transform: scale(1.06);
228
+ border-color: var(--purple-electric);
229
+ box-shadow: 0 0 12px var(--purple-glow);
230
+ }
231
+
232
+ .brand-text {
233
+ display: flex;
234
+ flex-direction: column;
235
+ justify-content: center;
236
+ min-width: 0;
237
+ line-height: 1.15;
238
+ }
239
+
240
+ .brand-title {
241
+ color: var(--text-white);
242
+ font-size: 1.25rem;
243
+ font-weight: 700;
244
+ margin: 0;
245
+ line-height: 1.15;
246
+ letter-spacing: -0.3px;
247
+ white-space: nowrap;
248
+ }
249
+
250
+ .ti-highlight {
251
+ color: var(--purple-electric);
252
+ font-weight: 800;
253
+ }
254
+
255
+ .brand-subtitle {
256
+ font-size: 0.7rem;
257
+ color: var(--text-secondary);
258
+ font-weight: 500;
259
+ letter-spacing: 0.5px;
260
+ text-transform: uppercase;
261
+ white-space: nowrap;
262
+ }
263
+
264
+ .header-docs-icon-btn {
265
+ display: inline-flex;
266
+ align-items: center;
267
+ justify-content: center;
268
+ width: 34px;
269
+ height: 34px;
270
+ border-radius: 8px;
271
+ background: rgba(0, 229, 255, 0.08);
272
+ border: 1px solid rgba(0, 229, 255, 0.28);
273
+ color: var(--cyan-accent);
274
+ text-decoration: none;
275
+ transition: all 0.2s ease;
276
+ margin-left: 0.5rem;
277
+ flex-shrink: 0;
278
+ }
279
+
280
+ .header-docs-icon-btn .ui-icon {
281
+ width: 17px;
282
+ height: 17px;
283
+ stroke-width: 2.2px;
284
+ }
285
+
286
+ .header-docs-icon-btn:hover {
287
+ background: rgba(0, 229, 255, 0.22);
288
+ border-color: var(--cyan-accent);
289
+ color: #fff;
290
+ box-shadow: 0 0 14px var(--cyan-glow);
291
+ transform: translateY(-1px);
292
+ }
293
+
294
+ /* Header Right Controls */
295
+ .header-right {
296
+ display: flex;
297
+ align-items: center;
298
+ justify-content: flex-end;
299
+ flex-shrink: 0;
300
+ gap: 1.25rem;
301
+ }
302
+
303
+ .header-control-group {
304
+ display: flex;
305
+ align-items: center;
306
+ gap: 0.5rem;
307
+ }
308
+
309
+ .control-label {
310
+ display: inline-flex;
311
+ align-items: center;
312
+ justify-content: center;
313
+ color: var(--text-secondary);
314
+ cursor: pointer;
315
+ transition: color 0.2s ease;
316
+ }
317
+
318
+ .control-label:hover {
319
+ color: var(--cyan-accent);
320
+ }
321
+
322
+ .control-label .label-icon {
323
+ width: 16px;
324
+ height: 16px;
325
+ stroke-width: 2.2px;
326
+ }
327
+
328
+ .db-select-input {
329
+ background: var(--bg-card);
330
+ border: 1px solid var(--border-color);
331
+ color: var(--text-primary);
332
+ padding: 0.45rem 0.85rem;
333
+ border-radius: 8px;
334
+ font-size: 0.85rem;
335
+ font-weight: 600;
336
+ font-family: var(--font-mono);
337
+ cursor: pointer;
338
+ outline: none;
339
+ transition: all 0.2s ease;
340
+ max-width: 220px;
341
+ text-overflow: ellipsis;
342
+ }
343
+
344
+ .db-select-input:hover, .db-select-input:focus {
345
+ background: var(--bg-card-hover);
346
+ border-color: var(--purple-electric);
347
+ box-shadow: 0 0 12px var(--purple-glow);
348
+ }
349
+
350
+ .db-select-input option {
351
+ background: var(--bg-secondary);
352
+ color: var(--text-primary);
353
+ }
354
+
355
+ /* Database Selector Dropdown */
356
+ .db-dropdown-wrapper {
357
+ position: relative;
358
+ display: inline-block;
359
+ }
360
+
361
+ .action-btn.db-trigger-btn {
362
+ background: linear-gradient(135deg, #0a1128 0%, var(--bg-card) 100%);
363
+ border: 1px solid var(--border-color);
364
+ color: var(--text-white);
365
+ padding: 0.45rem 0.9rem;
366
+ border-radius: 8px;
367
+ font-size: 0.82rem;
368
+ font-weight: 600;
369
+ cursor: pointer;
370
+ display: flex;
371
+ align-items: center;
372
+ gap: 0.5rem;
373
+ transition: all 0.2s ease;
374
+ white-space: nowrap;
375
+ max-width: 240px;
376
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
377
+ }
378
+
379
+ .action-btn.db-trigger-btn:hover {
380
+ background: var(--bg-card-hover);
381
+ border-color: var(--cyan-accent);
382
+ color: var(--text-white);
383
+ box-shadow: 0 0 16px var(--cyan-glow);
384
+ transform: translateY(-1px);
385
+ }
386
+
387
+ .db-icon-main {
388
+ width: 15px;
389
+ height: 15px;
390
+ color: var(--cyan-accent);
391
+ flex-shrink: 0;
392
+ }
393
+
394
+ .current-db-label {
395
+ overflow: hidden;
396
+ text-overflow: ellipsis;
397
+ white-space: nowrap;
398
+ font-family: var(--font-mono, monospace);
399
+ font-size: 0.8rem;
400
+ color: var(--cyan-accent);
401
+ letter-spacing: 0.02em;
402
+ }
403
+
404
+ .db-dropdown-wrapper.active .dropdown-chevron {
405
+ transform: rotate(180deg);
406
+ }
407
+
408
+ .db-dropdown-menu {
409
+ display: none;
410
+ position: absolute;
411
+ top: calc(100% + 8px);
412
+ right: 0;
413
+ background: var(--bg-card);
414
+ border: 1px solid var(--border-color);
415
+ border-top: 2px solid var(--cyan-accent);
416
+ border-radius: 10px;
417
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.75), 0 0 24px var(--cyan-glow);
418
+ min-width: 280px;
419
+ max-width: 360px;
420
+ z-index: 1050;
421
+ padding: 0.45rem;
422
+ backdrop-filter: blur(16px);
423
+ }
424
+
425
+ .db-dropdown-wrapper.active .db-dropdown-menu {
426
+ display: flex;
427
+ flex-direction: column;
428
+ gap: 0.3rem;
429
+ animation: fadeInDropdown 0.18s cubic-bezier(0.16, 1, 0.3, 1);
430
+ }
431
+
432
+ .db-dropdown-header {
433
+ display: flex;
434
+ align-items: center;
435
+ justify-content: space-between;
436
+ padding: 0.4rem 0.6rem 0.45rem 0.6rem;
437
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
438
+ font-size: 0.72rem;
439
+ text-transform: uppercase;
440
+ font-weight: 700;
441
+ letter-spacing: 0.06em;
442
+ color: var(--text-muted);
443
+ }
444
+
445
+ .db-count-badge {
446
+ background: rgba(0, 240, 255, 0.15);
447
+ color: var(--cyan-accent);
448
+ border: 1px solid rgba(0, 240, 255, 0.3);
449
+ font-size: 0.68rem;
450
+ padding: 0.1rem 0.4rem;
451
+ border-radius: 10px;
452
+ font-family: var(--font-mono, monospace);
453
+ }
454
+
455
+ .db-dropdown-list {
456
+ display: flex;
457
+ flex-direction: column;
458
+ gap: 0.25rem;
459
+ max-height: 280px;
460
+ overflow-y: auto;
461
+ padding-right: 2px;
462
+ }
463
+
464
+ .db-dropdown-list::-webkit-scrollbar {
465
+ width: 4px;
466
+ }
467
+
468
+ .db-dropdown-list::-webkit-scrollbar-thumb {
469
+ background: rgba(255, 255, 255, 0.15);
470
+ border-radius: 4px;
471
+ }
472
+
473
+ .db-dropdown-item {
474
+ display: flex;
475
+ align-items: center;
476
+ justify-content: space-between;
477
+ gap: 0.5rem;
478
+ padding: 0.45rem 0.6rem;
479
+ border-radius: 8px;
480
+ background: rgba(255, 255, 255, 0.02);
481
+ border: 1px solid transparent;
482
+ transition: all 0.15s ease;
483
+ }
484
+
485
+ .db-dropdown-item:hover {
486
+ background: var(--bg-card-hover);
487
+ border-color: rgba(0, 240, 255, 0.25);
488
+ box-shadow: 0 0 10px var(--cyan-glow);
489
+ }
490
+
491
+ .db-dropdown-item.is-active {
492
+ background: rgba(0, 240, 255, 0.09);
493
+ border-color: rgba(0, 240, 255, 0.45);
494
+ }
495
+
496
+ .db-item-main {
497
+ display: flex;
498
+ align-items: center;
499
+ gap: 0.6rem;
500
+ flex: 1;
501
+ min-width: 0;
502
+ cursor: pointer;
503
+ text-align: left;
504
+ background: none;
505
+ border: none;
506
+ padding: 0;
507
+ }
508
+
509
+ .db-item-icon {
510
+ width: 16px;
511
+ height: 16px;
512
+ color: var(--text-secondary);
513
+ flex-shrink: 0;
514
+ transition: color 0.15s ease;
515
+ }
516
+
517
+ .db-dropdown-item.is-active .db-item-icon,
518
+ .db-dropdown-item:hover .db-item-icon {
519
+ color: var(--cyan-accent);
520
+ }
521
+
522
+ .db-item-info {
523
+ display: flex;
524
+ flex-direction: column;
525
+ min-width: 0;
526
+ line-height: 1.25;
527
+ }
528
+
529
+ .db-item-name {
530
+ font-size: 0.82rem;
531
+ font-weight: 600;
532
+ color: var(--text-primary);
533
+ overflow: hidden;
534
+ text-overflow: ellipsis;
535
+ white-space: nowrap;
536
+ }
537
+
538
+ .db-dropdown-item.is-active .db-item-name {
539
+ color: var(--cyan-accent);
540
+ font-weight: 700;
541
+ }
542
+
543
+ .db-item-meta {
544
+ font-size: 0.68rem;
545
+ color: var(--text-muted);
546
+ font-family: var(--font-mono, monospace);
547
+ }
548
+
549
+ .btn-delete-db {
550
+ background: transparent;
551
+ border: 1px solid transparent;
552
+ color: var(--text-muted);
553
+ padding: 0.35rem 0.4rem;
554
+ border-radius: 6px;
555
+ cursor: pointer;
556
+ display: inline-flex;
557
+ align-items: center;
558
+ justify-content: center;
559
+ transition: all 0.15s ease;
560
+ flex-shrink: 0;
561
+ }
562
+
563
+ .btn-delete-db:hover {
564
+ background: rgba(239, 68, 68, 0.15);
565
+ border-color: rgba(239, 68, 68, 0.4);
566
+ color: #ef4444;
567
+ transform: scale(1.05);
568
+ box-shadow: 0 0 8px rgba(239, 68, 68, 0.35);
569
+ }
570
+
571
+ /* Generic Confirmation Modal Styles */
572
+ .modal-backdrop {
573
+ position: fixed;
574
+ top: 0;
575
+ left: 0;
576
+ right: 0;
577
+ bottom: 0;
578
+ background: rgba(5, 8, 22, 0.85);
579
+ backdrop-filter: blur(8px);
580
+ -webkit-backdrop-filter: blur(8px);
581
+ z-index: 2500;
582
+ display: flex;
583
+ align-items: center;
584
+ justify-content: center;
585
+ padding: 1.5rem;
586
+ animation: fadeInModal 0.2s ease-out;
587
+ }
588
+
589
+ @keyframes fadeInModal {
590
+ from { opacity: 0; }
591
+ to { opacity: 1; }
592
+ }
593
+
594
+ .modal-dialog {
595
+ background: var(--bg-card);
596
+ border: 1px solid var(--border-color);
597
+ border-top: 3px solid #ef4444;
598
+ border-radius: 12px;
599
+ box-shadow: 0 20px 48px rgba(0, 0, 0, 0.8), 0 0 32px rgba(239, 68, 68, 0.2);
600
+ width: 100%;
601
+ max-width: 440px;
602
+ display: flex;
603
+ flex-direction: column;
604
+ animation: scaleInModal 0.2s cubic-bezier(0.16, 1, 0.3, 1);
605
+ }
606
+
607
+ @keyframes scaleInModal {
608
+ from { transform: scale(0.94); opacity: 0; }
609
+ to { transform: scale(1); opacity: 1; }
610
+ }
611
+
612
+ .modal-header {
613
+ display: flex;
614
+ align-items: center;
615
+ justify-content: space-between;
616
+ padding: 1rem 1.25rem;
617
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
618
+ }
619
+
620
+ .modal-title-row {
621
+ display: flex;
622
+ align-items: center;
623
+ gap: 0.6rem;
624
+ }
625
+
626
+ .modal-title-row h3 {
627
+ margin: 0;
628
+ font-size: 1rem;
629
+ font-weight: 700;
630
+ color: var(--text-white);
631
+ }
632
+
633
+ .modal-danger-icon {
634
+ width: 20px;
635
+ height: 20px;
636
+ }
637
+
638
+ .modal-close-btn {
639
+ background: transparent;
640
+ border: none;
641
+ color: var(--text-muted);
642
+ cursor: pointer;
643
+ padding: 0.25rem;
644
+ border-radius: 6px;
645
+ display: flex;
646
+ align-items: center;
647
+ justify-content: center;
648
+ transition: color 0.15s ease;
649
+ }
650
+
651
+ .modal-close-btn:hover {
652
+ color: var(--text-white);
653
+ }
654
+
655
+ .modal-body {
656
+ padding: 1.25rem;
657
+ color: var(--text-primary);
658
+ font-size: 0.88rem;
659
+ line-height: 1.5;
660
+ }
661
+
662
+ .modal-footer {
663
+ display: flex;
664
+ align-items: center;
665
+ justify-content: flex-end;
666
+ gap: 0.75rem;
667
+ padding: 0.9rem 1.25rem;
668
+ border-top: 1px solid rgba(255, 255, 255, 0.08);
669
+ background: rgba(0, 0, 0, 0.25);
670
+ border-radius: 0 0 12px 12px;
671
+ }
672
+
673
+ .modal-cancel-btn {
674
+ background: rgba(255, 255, 255, 0.06);
675
+ border: 1px solid var(--border-color);
676
+ color: var(--text-primary);
677
+ padding: 0.45rem 1rem;
678
+ border-radius: 6px;
679
+ font-size: 0.82rem;
680
+ font-weight: 600;
681
+ cursor: pointer;
682
+ transition: all 0.15s ease;
683
+ }
684
+
685
+ .modal-cancel-btn:hover {
686
+ background: rgba(255, 255, 255, 0.12);
687
+ color: var(--text-white);
688
+ }
689
+
690
+ .modal-danger-btn {
691
+ background: #dc2626;
692
+ border: 1px solid #ef4444;
693
+ color: #fff;
694
+ padding: 0.45rem 1.1rem;
695
+ border-radius: 6px;
696
+ font-size: 0.82rem;
697
+ font-weight: 600;
698
+ cursor: pointer;
699
+ display: inline-flex;
700
+ align-items: center;
701
+ gap: 0.45rem;
702
+ transition: all 0.15s ease;
703
+ box-shadow: 0 0 12px rgba(239, 68, 68, 0.4);
704
+ }
705
+
706
+ .modal-danger-btn:hover {
707
+ background: #b91c1c;
708
+ border-color: #f87171;
709
+ box-shadow: 0 0 18px rgba(239, 68, 68, 0.6);
710
+ transform: translateY(-1px);
711
+ }
712
+
713
+ /* Toast Notification System */
714
+ .toast-container {
715
+ position: fixed;
716
+ bottom: 1.5rem;
717
+ right: 1.5rem;
718
+ display: flex;
719
+ flex-direction: column;
720
+ gap: 0.6rem;
721
+ z-index: 3000;
722
+ pointer-events: none;
723
+ max-width: 380px;
724
+ }
725
+
726
+ .toast-notification {
727
+ pointer-events: auto;
728
+ display: flex;
729
+ align-items: center;
730
+ gap: 0.65rem;
731
+ padding: 0.7rem 0.95rem;
732
+ border-radius: 8px;
733
+ background: rgba(13, 17, 38, 0.95);
734
+ border: 1px solid var(--border-color);
735
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.6), 0 0 16px rgba(0, 240, 255, 0.15);
736
+ backdrop-filter: blur(12px);
737
+ -webkit-backdrop-filter: blur(12px);
738
+ color: var(--text-primary);
739
+ font-size: 0.82rem;
740
+ font-weight: 500;
741
+ animation: toastSlideIn 0.25s cubic-bezier(0.16, 1, 0.3, 1);
742
+ transition: all 0.25s ease;
743
+ }
744
+
745
+ .toast-notification.fade-out {
746
+ opacity: 0;
747
+ transform: translateX(20px) scale(0.95);
748
+ }
749
+
750
+ @keyframes toastSlideIn {
751
+ from {
752
+ opacity: 0;
753
+ transform: translateY(12px) scale(0.95);
754
+ }
755
+ to {
756
+ opacity: 1;
757
+ transform: translateY(0) scale(1);
758
+ }
759
+ }
760
+
761
+ .toast-icon {
762
+ width: 18px;
763
+ height: 18px;
764
+ flex-shrink: 0;
765
+ }
766
+
767
+ .toast-message {
768
+ flex: 1;
769
+ line-height: 1.35;
770
+ }
771
+
772
+ .toast-close-btn {
773
+ background: transparent;
774
+ border: none;
775
+ color: var(--text-muted);
776
+ cursor: pointer;
777
+ padding: 0.2rem;
778
+ border-radius: 4px;
779
+ display: flex;
780
+ align-items: center;
781
+ justify-content: center;
782
+ transition: color 0.15s ease;
783
+ }
784
+
785
+ .toast-close-btn:hover {
786
+ color: var(--text-white);
787
+ }
788
+
789
+ .toast-success {
790
+ border-left: 3px solid #10b981;
791
+ }
792
+ .toast-success .toast-icon {
793
+ color: #10b981;
794
+ }
795
+
796
+ .toast-error {
797
+ border-left: 3px solid #ef4444;
798
+ }
799
+ .toast-error .toast-icon {
800
+ color: #ef4444;
801
+ }
802
+
803
+ .toast-warning {
804
+ border-left: 3px solid #f59e0b;
805
+ }
806
+ .toast-warning .toast-icon {
807
+ color: #f59e0b;
808
+ }
809
+
810
+ .toast-info {
811
+ border-left: 3px solid var(--cyan-accent);
812
+ }
813
+ .toast-info .toast-icon {
814
+ color: var(--cyan-accent);
815
+ }
816
+
817
+ /* Export Dropdown Menu */
818
+ .export-dropdown-wrapper {
819
+ position: relative;
820
+ display: inline-block;
821
+ }
822
+
823
+ .export-trigger-btn {
824
+ display: flex;
825
+ align-items: center;
826
+ gap: 0.5rem;
827
+ }
828
+
829
+ .dropdown-chevron {
830
+ font-size: 0.65rem;
831
+ color: var(--text-secondary);
832
+ transition: transform 0.2s ease;
833
+ }
834
+
835
+ .export-dropdown-wrapper.active .dropdown-chevron {
836
+ transform: rotate(180deg);
837
+ }
838
+
839
+ .action-btn.export-btn {
840
+ background: linear-gradient(135deg, #0C184B 0%, var(--bg-card) 100%);
841
+ border: 1px solid var(--border-color);
842
+ color: var(--text-white);
843
+ padding: 0.45rem 0.95rem;
844
+ border-radius: 8px;
845
+ font-size: 0.82rem;
846
+ font-weight: 600;
847
+ cursor: pointer;
848
+ display: flex;
849
+ align-items: center;
850
+ gap: 0.45rem;
851
+ transition: all 0.2s ease;
852
+ white-space: nowrap;
853
+ text-decoration: none;
854
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
855
+ }
856
+
857
+ .action-btn.export-btn:hover {
858
+ background: var(--purple-electric);
859
+ border-color: var(--purple-electric);
860
+ color: var(--text-white);
861
+ box-shadow: 0 0 16px var(--purple-glow-intense);
862
+ transform: translateY(-1px);
863
+ }
864
+
865
+ .action-btn.export-btn:hover .dropdown-chevron {
866
+ color: var(--text-white);
867
+ }
868
+
869
+ .action-btn.export-btn:active {
870
+ transform: scale(0.97);
871
+ }
872
+
873
+ .export-dropdown-menu {
874
+ display: none;
875
+ position: absolute;
876
+ top: calc(100% + 8px);
877
+ right: 0;
878
+ background: var(--bg-card);
879
+ border: 1px solid var(--border-color);
880
+ border-top: 2px solid var(--purple-electric);
881
+ border-radius: 10px;
882
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.7), 0 0 20px var(--purple-glow);
883
+ min-width: 230px;
884
+ z-index: 1000;
885
+ padding: 0.45rem;
886
+ backdrop-filter: blur(14px);
887
+ }
888
+
889
+ .export-dropdown-wrapper.active .export-dropdown-menu {
890
+ display: flex;
891
+ flex-direction: column;
892
+ gap: 0.25rem;
893
+ animation: fadeInDropdown 0.18s cubic-bezier(0.16, 1, 0.3, 1);
894
+ }
895
+
896
+ @keyframes fadeInDropdown {
897
+ from {
898
+ opacity: 0;
899
+ transform: translateY(-6px);
900
+ }
901
+ to {
902
+ opacity: 1;
903
+ transform: translateY(0);
904
+ }
905
+ }
906
+
907
+ .export-dropdown-item {
908
+ display: flex;
909
+ align-items: center;
910
+ gap: 0.75rem;
911
+ background: transparent;
912
+ border: none;
913
+ padding: 0.6rem 0.8rem;
914
+ border-radius: 8px;
915
+ cursor: pointer;
916
+ width: 100%;
917
+ text-align: left;
918
+ transition: all 0.15s ease;
919
+ }
920
+
921
+ .export-dropdown-item:hover {
922
+ background: var(--bg-card-hover);
923
+ box-shadow: 0 0 10px var(--purple-glow);
924
+ }
925
+
926
+ .export-item-icon {
927
+ width: 20px;
928
+ height: 20px;
929
+ color: var(--purple-electric);
930
+ flex-shrink: 0;
931
+ transition: all 0.2s ease;
932
+ }
933
+
934
+ .export-dropdown-item:hover .export-item-icon {
935
+ color: var(--cyan-accent);
936
+ filter: drop-shadow(0 0 6px var(--cyan-glow));
937
+ transform: scale(1.08);
938
+ }
939
+
940
+ .export-item-text {
941
+ display: flex;
942
+ flex-direction: column;
943
+ line-height: 1.25;
944
+ }
945
+
946
+ .export-item-title {
947
+ font-size: 0.85rem;
948
+ font-weight: 600;
949
+ color: var(--text-primary);
950
+ }
951
+
952
+ .export-dropdown-item:hover .export-item-title {
953
+ color: var(--text-white);
954
+ }
955
+
956
+ .export-item-desc {
957
+ font-size: 0.72rem;
958
+ color: var(--text-secondary);
959
+ }
960
+
961
+ .target-info {
962
+ display: flex;
963
+ flex-direction: column;
964
+ align-items: flex-end;
965
+ max-width: 250px;
966
+ overflow: hidden;
967
+ }
968
+
969
+ #target-name {
970
+ font-size: 1rem;
971
+ font-weight: 600;
972
+ color: var(--text-white);
973
+ white-space: nowrap;
974
+ overflow: hidden;
975
+ text-overflow: ellipsis;
976
+ max-width: 100%;
977
+ }
978
+
979
+ .db-info {
980
+ font-size: 0.75rem;
981
+ color: var(--text-secondary);
982
+ font-family: var(--font-mono);
983
+ white-space: nowrap;
984
+ overflow: hidden;
985
+ text-overflow: ellipsis;
986
+ max-width: 100%;
987
+ }
988
+
989
+ /* ==========================================================================
990
+ Main Layout & Sidebar
991
+ ========================================================================= */
992
+
993
+ .dashboard-main {
994
+ display: flex;
995
+ flex: 1;
996
+ overflow: hidden;
997
+ position: relative;
998
+ width: 100%;
999
+ height: 100%;
1000
+ }
1001
+
1002
+ /* Drawer Backdrops */
1003
+ .drawer-backdrop {
1004
+ display: none;
1005
+ position: fixed;
1006
+ top: 0;
1007
+ left: 0;
1008
+ right: 0;
1009
+ bottom: 0;
1010
+ background: rgba(0, 0, 0, 0.75);
1011
+ backdrop-filter: blur(4px);
1012
+ -webkit-backdrop-filter: blur(4px);
1013
+ z-index: 998;
1014
+ opacity: 0;
1015
+ pointer-events: none;
1016
+ transition: opacity 0.25s ease;
1017
+ }
1018
+
1019
+ .drawer-backdrop.active {
1020
+ display: block;
1021
+ opacity: 1;
1022
+ pointer-events: auto;
1023
+ }
1024
+
1025
+ /* Sidebar */
1026
+ .sidebar {
1027
+ width: 325px;
1028
+ height: 100%;
1029
+ max-height: 100%;
1030
+ background: var(--bg-secondary);
1031
+ border-right: 1px solid var(--border-color);
1032
+ padding: 1.1rem 1rem 2.5rem 1rem;
1033
+ overflow-y: auto;
1034
+ overflow-x: hidden;
1035
+ display: flex;
1036
+ flex-direction: column;
1037
+ gap: 0.95rem;
1038
+ flex-shrink: 0;
1039
+ scrollbar-width: thin;
1040
+ scrollbar-color: rgba(140, 82, 255, 0.25) transparent;
1041
+ z-index: 50;
1042
+ transition: margin-left 0.3s cubic-bezier(0.4, 0, 0.2, 1);
1043
+ }
1044
+
1045
+ .sidebar.collapsed {
1046
+ margin-left: -325px;
1047
+ }
1048
+
1049
+ .sidebar-mobile-header {
1050
+ display: none;
1051
+ align-items: center;
1052
+ justify-content: space-between;
1053
+ padding-bottom: 0.75rem;
1054
+ border-bottom: 1px solid var(--border-color);
1055
+ }
1056
+
1057
+ .sidebar-mobile-title {
1058
+ font-weight: 700;
1059
+ color: var(--text-white);
1060
+ font-size: 1rem;
1061
+ }
1062
+
1063
+ .sidebar-close-btn {
1064
+ background: var(--bg-card);
1065
+ border: 1px solid var(--border-color);
1066
+ color: var(--text-secondary);
1067
+ width: 32px;
1068
+ height: 32px;
1069
+ border-radius: 8px;
1070
+ font-size: 1.1rem;
1071
+ cursor: pointer;
1072
+ display: flex;
1073
+ align-items: center;
1074
+ justify-content: center;
1075
+ transition: all 0.2s ease;
1076
+ }
1077
+
1078
+ .sidebar-close-btn:hover {
1079
+ background: var(--risk-critical);
1080
+ border-color: var(--risk-critical);
1081
+ color: #fff;
1082
+ }
1083
+
1084
+ /* Panels */
1085
+ .panel {
1086
+ background: var(--bg-card);
1087
+ border: 1px solid var(--border-card);
1088
+ border-radius: 12px;
1089
+ padding: 1.15rem;
1090
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);
1091
+ transition: border-color 0.2s ease;
1092
+ }
1093
+
1094
+ .panel:hover {
1095
+ border-color: var(--border-color);
1096
+ }
1097
+
1098
+ .panel h3 {
1099
+ color: var(--text-white);
1100
+ margin-bottom: 0.85rem;
1101
+ font-size: 0.92rem;
1102
+ font-weight: 600;
1103
+ border-bottom: 1px solid var(--border-color);
1104
+ padding-bottom: 0.45rem;
1105
+ letter-spacing: 0.3px;
1106
+ display: flex;
1107
+ align-items: center;
1108
+ }
1109
+
1110
+ /* Metrics Panel: Organized in 2-Column Pairs */
1111
+ .metric-grid {
1112
+ display: grid;
1113
+ grid-template-columns: repeat(2, 1fr);
1114
+ gap: 0.6rem;
1115
+ }
1116
+
1117
+ .metric-item {
1118
+ display: flex;
1119
+ flex-direction: column;
1120
+ align-items: center;
1121
+ justify-content: center;
1122
+ padding: 0.65rem 0.5rem;
1123
+ background: var(--bg-secondary);
1124
+ border-radius: 8px;
1125
+ border: 1px solid var(--border-card);
1126
+ transition: all 0.25s ease;
1127
+ min-height: 64px;
1128
+ }
1129
+
1130
+ .metric-item:hover {
1131
+ border-color: var(--purple-electric);
1132
+ box-shadow: 0 4px 14px var(--purple-glow);
1133
+ transform: translateY(-2px);
1134
+ }
1135
+
1136
+ .metric-item.critical {
1137
+ border-color: rgba(220, 20, 60, 0.3);
1138
+ }
1139
+
1140
+ .metric-item.critical:hover {
1141
+ border-color: var(--risk-critical);
1142
+ box-shadow: 0 4px 14px rgba(220, 20, 60, 0.35);
1143
+ }
1144
+
1145
+ .metric-item.verified-highlight {
1146
+ border-color: rgba(34, 197, 94, 0.3);
1147
+ }
1148
+
1149
+ .metric-item.verified-highlight:hover {
1150
+ border-color: #22c55e;
1151
+ box-shadow: 0 4px 14px rgba(34, 197, 94, 0.35);
1152
+ }
1153
+
1154
+ .metric-item.epss-highlight {
1155
+ border-color: rgba(245, 158, 11, 0.3);
1156
+ }
1157
+
1158
+ .metric-item.epss-highlight:hover {
1159
+ border-color: #f59e0b;
1160
+ box-shadow: 0 4px 14px rgba(245, 158, 11, 0.35);
1161
+ }
1162
+
1163
+ .metric-value {
1164
+ font-family: var(--font-mono);
1165
+ font-size: 1.22rem;
1166
+ font-weight: 700;
1167
+ color: var(--cyan-accent);
1168
+ line-height: 1.2;
1169
+ }
1170
+
1171
+ .metric-item.verified-highlight .metric-value {
1172
+ color: #4ade80;
1173
+ }
1174
+
1175
+ .metric-item.epss-highlight .metric-value {
1176
+ color: #fbbf24;
1177
+ }
1178
+
1179
+ .metric-item.critical .metric-value {
1180
+ color: var(--risk-critical);
1181
+ }
1182
+
1183
+ .metric-label {
1184
+ font-size: 0.65rem;
1185
+ color: var(--text-secondary);
1186
+ text-align: center;
1187
+ text-transform: uppercase;
1188
+ letter-spacing: 0.4px;
1189
+ line-height: 1.15;
1190
+ margin-top: 0.25rem;
1191
+ }
1192
+
1193
+ /* Search Panel */
1194
+ .panel.search-panel {
1195
+ padding: 0.75rem;
1196
+ }
1197
+
1198
+ .search-group {
1199
+ position: relative;
1200
+ display: flex;
1201
+ align-items: center;
1202
+ width: 100%;
1203
+ margin-bottom: 0;
1204
+ }
1205
+
1206
+ .search-input {
1207
+ width: 100%;
1208
+ background: var(--bg-primary);
1209
+ border: 1px solid var(--border-color);
1210
+ color: var(--text-primary);
1211
+ padding: 0.65rem 0.85rem 0.65rem 2.35rem;
1212
+ padding-right: 2.5rem;
1213
+ border-radius: 10px;
1214
+ font-size: 0.85rem;
1215
+ font-family: var(--font-main);
1216
+ transition: all 0.2s ease;
1217
+ }
1218
+
1219
+ .search-input::placeholder {
1220
+ color: var(--text-muted);
1221
+ font-size: 0.82rem;
1222
+ }
1223
+
1224
+ .search-input:focus {
1225
+ outline: none;
1226
+ border-color: var(--purple-electric);
1227
+ box-shadow: 0 0 0 2px var(--purple-glow);
1228
+ }
1229
+
1230
+ .clear-btn {
1231
+ position: absolute;
1232
+ right: 0.625rem;
1233
+ background: transparent;
1234
+ border: none;
1235
+ color: var(--text-muted);
1236
+ padding: 0.25rem;
1237
+ cursor: pointer;
1238
+ font-size: 1.2rem;
1239
+ line-height: 1;
1240
+ transition: color 0.2s ease;
1241
+ }
1242
+
1243
+ .clear-btn:hover {
1244
+ color: var(--text-white);
1245
+ }
1246
+
1247
+ .search-input:placeholder-shown + .clear-btn {
1248
+ display: none;
1249
+ }
1250
+
1251
+ /* Accordion Panels (Lead Selector & Filters) */
1252
+ .panel.filters-accordion-panel,
1253
+ .panel.lead-accordion-panel {
1254
+ padding: 0;
1255
+ overflow: hidden;
1256
+ flex-shrink: 0;
1257
+ }
1258
+
1259
+ .sidebar-accordion,
1260
+ .filters-accordion {
1261
+ width: 100%;
1262
+ }
1263
+
1264
+ .accordion-header {
1265
+ display: flex;
1266
+ align-items: center;
1267
+ justify-content: space-between;
1268
+ padding: 0.85rem 1.1rem;
1269
+ cursor: pointer;
1270
+ user-select: none;
1271
+ background: var(--bg-card);
1272
+ transition: background 0.2s ease;
1273
+ list-style: none;
1274
+ }
1275
+
1276
+ .accordion-header::-webkit-details-marker {
1277
+ display: none;
1278
+ }
1279
+
1280
+ .accordion-header:hover {
1281
+ background: var(--bg-card-hover);
1282
+ }
1283
+
1284
+ .accordion-title {
1285
+ color: var(--text-primary);
1286
+ font-size: 0.92rem;
1287
+ font-weight: 600;
1288
+ letter-spacing: 0.2px;
1289
+ display: flex;
1290
+ align-items: center;
1291
+ }
1292
+
1293
+ .accordion-icon {
1294
+ color: var(--purple-light);
1295
+ font-size: 0.75rem;
1296
+ transition: transform 0.25s ease;
1297
+ }
1298
+
1299
+ .sidebar-accordion[open] .accordion-icon,
1300
+ .filters-accordion[open] .accordion-icon {
1301
+ transform: rotate(180deg);
1302
+ color: var(--purple-electric);
1303
+ }
1304
+
1305
+ .accordion-body {
1306
+ padding: 1rem 1.1rem;
1307
+ border-top: 1px solid var(--border-color);
1308
+ background: var(--bg-secondary);
1309
+ }
1310
+
1311
+ /* Filters Group */
1312
+ .filter-group {
1313
+ display: flex;
1314
+ flex-direction: column;
1315
+ gap: 0.8rem;
1316
+ }
1317
+
1318
+ .filter-checkbox {
1319
+ display: flex;
1320
+ align-items: center;
1321
+ cursor: pointer;
1322
+ font-size: 0.88rem;
1323
+ color: var(--text-secondary);
1324
+ transition: all 0.2s ease;
1325
+ padding: 3px 0;
1326
+ flex-wrap: wrap;
1327
+ row-gap: 2px;
1328
+ }
1329
+
1330
+ .filter-checkbox:hover {
1331
+ color: var(--text-white);
1332
+ }
1333
+
1334
+ .filter-checkbox input[type="checkbox"] {
1335
+ display: none;
1336
+ }
1337
+
1338
+ .checkmark {
1339
+ width: 18px;
1340
+ height: 18px;
1341
+ background: var(--bg-card);
1342
+ border: 1.5px solid var(--border-color);
1343
+ border-radius: 5px;
1344
+ margin-right: 0.8rem;
1345
+ position: relative;
1346
+ transition: all 0.2s ease;
1347
+ flex-shrink: 0;
1348
+ }
1349
+
1350
+ .filter-checkbox input[type="checkbox"]:checked + .checkmark {
1351
+ background: var(--purple-electric);
1352
+ border-color: var(--purple-electric);
1353
+ box-shadow: 0 0 8px var(--purple-glow);
1354
+ }
1355
+
1356
+ .filter-checkbox input[type="checkbox"]:checked + .checkmark::after {
1357
+ content: '✓';
1358
+ position: absolute;
1359
+ top: -2px;
1360
+ left: 3px;
1361
+ color: #fff;
1362
+ font-weight: bold;
1363
+ font-size: 12px;
1364
+ }
1365
+
1366
+ /* Lead Selector Panel */
1367
+ .lead-selector-panel {
1368
+ display: flex;
1369
+ flex-direction: column;
1370
+ flex-shrink: 0;
1371
+ transition: all 0.3s ease;
1372
+ }
1373
+
1374
+ .panel.lead-selector-panel:has(#lead-selector-accordion[open]) {
1375
+ flex: 1 1 auto;
1376
+ min-height: 0;
1377
+ }
1378
+
1379
+ #lead-selector-accordion[open] {
1380
+ display: flex;
1381
+ flex-direction: column;
1382
+ flex: 1 1 auto;
1383
+ min-height: 0;
1384
+ }
1385
+
1386
+ #lead-selector-accordion[open] > .accordion-body {
1387
+ display: flex;
1388
+ flex-direction: column;
1389
+ flex: 1 1 auto;
1390
+ min-height: 0;
1391
+ padding-bottom: 0.75rem;
1392
+ }
1393
+
1394
+ #lead-selector-container {
1395
+ display: flex;
1396
+ flex-direction: column;
1397
+ flex: 1 1 auto;
1398
+ min-height: 0;
1399
+ }
1400
+
1401
+ .lead-controls {
1402
+ display: flex;
1403
+ gap: 0.5rem;
1404
+ margin-bottom: 0.75rem;
1405
+ flex-shrink: 0;
1406
+ }
1407
+
1408
+ .lead-control-btn {
1409
+ flex: 1;
1410
+ background: var(--bg-card);
1411
+ border: 1px solid var(--border-color);
1412
+ color: var(--text-secondary);
1413
+ padding: 0.45rem;
1414
+ border-radius: 6px;
1415
+ cursor: pointer;
1416
+ font-size: 0.78rem;
1417
+ font-weight: 600;
1418
+ transition: all 0.2s ease;
1419
+ }
1420
+
1421
+ .lead-control-btn:hover {
1422
+ background: var(--purple-electric);
1423
+ color: #fff;
1424
+ border-color: var(--purple-electric);
1425
+ box-shadow: 0 0 10px var(--purple-glow);
1426
+ }
1427
+
1428
+ .lead-list {
1429
+ flex: 1 1 auto;
1430
+ overflow-y: auto;
1431
+ min-height: 180px;
1432
+ max-height: calc(100vh - 280px);
1433
+ max-height: calc(100dvh - 280px);
1434
+ padding-right: 0.25rem;
1435
+ background: transparent;
1436
+ border: none;
1437
+ scrollbar-width: thin;
1438
+ scrollbar-color: rgba(140, 82, 255, 0.25) transparent;
1439
+ }
1440
+
1441
+ .lead-loading {
1442
+ padding: 1rem;
1443
+ text-align: center;
1444
+ color: var(--text-muted);
1445
+ font-style: italic;
1446
+ font-size: 0.85rem;
1447
+ }
1448
+
1449
+ .lead-item {
1450
+ display: flex;
1451
+ align-items: flex-start;
1452
+ gap: 0.5rem;
1453
+ padding: 0.75rem 0.65rem;
1454
+ border-bottom: 1px solid var(--border-card);
1455
+ cursor: pointer;
1456
+ transition: all 0.2s ease;
1457
+ position: relative;
1458
+ border-radius: 6px;
1459
+ }
1460
+
1461
+ .lead-item:hover {
1462
+ background: var(--bg-card);
1463
+ border-left: 3px solid var(--purple-electric);
1464
+ }
1465
+
1466
+ .lead-item:last-child {
1467
+ border-bottom: none;
1468
+ }
1469
+
1470
+ .lead-item.selected {
1471
+ background: rgba(140, 82, 255, 0.12);
1472
+ border-left: 3px solid var(--purple-electric);
1473
+ }
1474
+
1475
+ .lead-checkbox {
1476
+ margin-right: 0.65rem;
1477
+ width: 16px;
1478
+ height: 16px;
1479
+ background: var(--bg-card);
1480
+ border: 1.5px solid var(--border-color);
1481
+ border-radius: 4px;
1482
+ position: relative;
1483
+ transition: all 0.2s ease;
1484
+ flex-shrink: 0;
1485
+ margin-top: 2px;
1486
+ }
1487
+
1488
+ .lead-item.selected .lead-checkbox {
1489
+ background: var(--purple-electric);
1490
+ border-color: var(--purple-electric);
1491
+ box-shadow: 0 0 6px var(--purple-glow);
1492
+ }
1493
+
1494
+ .lead-item.selected .lead-checkbox::after {
1495
+ content: '✓';
1496
+ position: absolute;
1497
+ top: -3px;
1498
+ left: 2px;
1499
+ color: #fff;
1500
+ font-weight: bold;
1501
+ font-size: 11px;
1502
+ }
1503
+
1504
+ .lead-info {
1505
+ flex: 1;
1506
+ display: flex;
1507
+ flex-direction: column;
1508
+ gap: 0.25rem;
1509
+ min-width: 0;
1510
+ }
1511
+
1512
+ .lead-header {
1513
+ display: flex;
1514
+ justify-content: space-between;
1515
+ align-items: center;
1516
+ }
1517
+
1518
+ .lead-name {
1519
+ font-weight: 600;
1520
+ color: var(--text-white);
1521
+ font-size: 0.86rem;
1522
+ font-family: var(--font-mono);
1523
+ white-space: nowrap;
1524
+ overflow: hidden;
1525
+ text-overflow: ellipsis;
1526
+ flex: 1;
1527
+ }
1528
+
1529
+ .lead-type {
1530
+ font-size: 0.68rem;
1531
+ font-weight: 700;
1532
+ color: var(--text-secondary);
1533
+ text-transform: uppercase;
1534
+ padding: 0.15rem 0.45rem;
1535
+ border-radius: 4px;
1536
+ background: var(--bg-card);
1537
+ border: 1px solid var(--border-card);
1538
+ flex-shrink: 0;
1539
+ }
1540
+
1541
+ .lead-type.ip {
1542
+ background: rgba(140, 82, 255, 0.15);
1543
+ border-color: rgba(140, 82, 255, 0.3);
1544
+ color: var(--purple-light);
1545
+ }
1546
+
1547
+ .lead-type.domain {
1548
+ background: rgba(0, 229, 255, 0.15);
1549
+ border-color: rgba(0, 229, 255, 0.3);
1550
+ color: var(--cyan-accent);
1551
+ }
1552
+
1553
+ .lead-badges {
1554
+ display: flex;
1555
+ flex-wrap: wrap;
1556
+ gap: 0.25rem;
1557
+ margin-top: 0.2rem;
1558
+ }
1559
+
1560
+ .lead-badge {
1561
+ display: inline-flex;
1562
+ align-items: center;
1563
+ gap: 0.25rem;
1564
+ padding: 0.2rem 0.5rem;
1565
+ border-radius: 6px;
1566
+ font-size: 0.68rem;
1567
+ font-weight: 700;
1568
+ text-transform: uppercase;
1569
+ letter-spacing: 0.3px;
1570
+ }
1571
+
1572
+ .badge-icon {
1573
+ width: 12px;
1574
+ height: 12px;
1575
+ stroke-width: 2.2px;
1576
+ vertical-align: middle;
1577
+ display: inline-block;
1578
+ flex-shrink: 0;
1579
+ }
1580
+
1581
+ .lead-badge.cve {
1582
+ background: rgba(59, 130, 246, 0.2);
1583
+ color: #60a5fa;
1584
+ border: 1px solid rgba(59, 130, 246, 0.4);
1585
+ }
1586
+
1587
+ .lead-badge.poc {
1588
+ background: rgba(243, 156, 18, 0.2);
1589
+ color: #f59e0b;
1590
+ border: 1px solid rgba(243, 156, 18, 0.4);
1591
+ }
1592
+
1593
+ .lead-badge.kev {
1594
+ background: rgba(220, 20, 60, 0.25);
1595
+ color: #ff4757;
1596
+ animation: pulse-badge 2s infinite;
1597
+ font-weight: 800;
1598
+ border: 1px solid rgba(220, 20, 60, 0.6);
1599
+ }
1600
+
1601
+ .lead-badge.critical {
1602
+ background: rgba(220, 20, 60, 0.25);
1603
+ color: #ff4757;
1604
+ border: 1px solid rgba(220, 20, 60, 0.5);
1605
+ }
1606
+
1607
+ .lead-badge.epss {
1608
+ background: rgba(245, 158, 11, 0.18);
1609
+ color: #f59e0b;
1610
+ border: 1px solid rgba(245, 158, 11, 0.4);
1611
+ }
1612
+
1613
+ @keyframes pulse-badge {
1614
+ 0% { box-shadow: 0 0 0 0 rgba(220, 20, 60, 0.7); }
1615
+ 70% { box-shadow: 0 0 0 4px rgba(220, 20, 60, 0); }
1616
+ 100% { box-shadow: 0 0 0 0 rgba(220, 20, 60, 0); }
1617
+ }
1618
+
1619
+ .lead-stats {
1620
+ font-size: 0.74rem;
1621
+ color: var(--text-muted);
1622
+ margin-top: 0.2rem;
1623
+ line-height: 1.3;
1624
+ }
1625
+
1626
+ /* Sidebar Footer */
1627
+ .sidebar-footer {
1628
+ margin-top: auto;
1629
+ padding-top: 1rem;
1630
+ text-align: center;
1631
+ font-size: 0.78rem;
1632
+ color: var(--text-muted);
1633
+ border-top: 1px solid var(--border-color);
1634
+ }
1635
+
1636
+ .sidebar-docs-link {
1637
+ color: var(--purple-light);
1638
+ font-weight: 600;
1639
+ text-decoration: none;
1640
+ font-size: 0.8rem;
1641
+ transition: color 0.2s ease;
1642
+ }
1643
+
1644
+ .sidebar-docs-link:hover {
1645
+ color: #ffffff;
1646
+ text-decoration: underline;
1647
+ }
1648
+
1649
+ .sidebar-docs-icon {
1650
+ vertical-align: middle;
1651
+ width: 14px;
1652
+ height: 14px;
1653
+ margin-right: 4px;
1654
+ }
1655
+
1656
+ .sidebar-powered {
1657
+ margin-top: 0.4rem;
1658
+ font-size: 0.75rem;
1659
+ color: var(--text-secondary);
1660
+ }
1661
+
1662
+ .sidebar-powered a {
1663
+ color: var(--text-white);
1664
+ text-decoration: none;
1665
+ font-weight: 600;
1666
+ transition: color 0.2s ease;
1667
+ }
1668
+
1669
+ .sidebar-powered a:hover {
1670
+ color: var(--purple-electric);
1671
+ }
1672
+
1673
+ /* ==========================================================================
1674
+ Graph Container & Floating Controls
1675
+ ========================================================================== */
1676
+
1677
+ .graph-container {
1678
+ flex: 1;
1679
+ position: relative;
1680
+ background: var(--bg-primary);
1681
+ background-image: radial-gradient(rgba(140, 82, 255, 0.08) 1px, transparent 1px);
1682
+ background-size: 28px 28px;
1683
+ width: 100%;
1684
+ height: 100%;
1685
+ min-width: 0;
1686
+ min-height: 0;
1687
+ overflow: hidden;
1688
+ }
1689
+
1690
+ .cytoscape-graph {
1691
+ width: 100%;
1692
+ height: 100%;
1693
+ touch-action: none;
1694
+ cursor: grab;
1695
+ }
1696
+
1697
+ .cytoscape-graph:active {
1698
+ cursor: grabbing;
1699
+ }
1700
+
1701
+ /* Custom Selection Box for Right-Click Marquee Selection */
1702
+ .custom-selection-box,
1703
+ #custom-selection-box {
1704
+ position: absolute;
1705
+ border: 1.5px dashed var(--purple-accent, #8C52FF);
1706
+ background: rgba(140, 82, 255, 0.22);
1707
+ box-shadow: 0 0 16px rgba(140, 82, 255, 0.45), inset 0 0 12px rgba(140, 82, 255, 0.2);
1708
+ border-radius: 4px;
1709
+ pointer-events: none;
1710
+ z-index: 99;
1711
+ display: none;
1712
+ }
1713
+
1714
+ /* Custom Node Right-Click Context Menu */
1715
+ .cy-context-menu {
1716
+ position: fixed;
1717
+ background: rgba(18, 20, 29, 0.96);
1718
+ border: 1px solid var(--border-color, rgba(140, 82, 255, 0.35));
1719
+ border-radius: 8px;
1720
+ padding: 6px;
1721
+ min-width: 230px;
1722
+ box-shadow: 0 12px 35px rgba(0, 0, 0, 0.75), 0 0 15px rgba(140, 82, 255, 0.25);
1723
+ backdrop-filter: blur(16px);
1724
+ z-index: 1000;
1725
+ display: none;
1726
+ flex-direction: column;
1727
+ gap: 3px;
1728
+ animation: contextMenuFadeIn 0.14s cubic-bezier(0.16, 1, 0.3, 1);
1729
+ }
1730
+
1731
+ @keyframes contextMenuFadeIn {
1732
+ from {
1733
+ opacity: 0;
1734
+ transform: scale(0.96) translateY(-4px);
1735
+ }
1736
+ to {
1737
+ opacity: 1;
1738
+ transform: scale(1) translateY(0);
1739
+ }
1740
+ }
1741
+
1742
+ .cy-context-menu-header {
1743
+ padding: 5px 8px 6px 8px;
1744
+ font-size: 0.72rem;
1745
+ font-weight: 700;
1746
+ text-transform: uppercase;
1747
+ letter-spacing: 0.05em;
1748
+ color: var(--text-muted, #94a3b8);
1749
+ border-bottom: 1px solid var(--border-card, rgba(255, 255, 255, 0.08));
1750
+ margin-bottom: 3px;
1751
+ display: flex;
1752
+ align-items: center;
1753
+ justify-content: space-between;
1754
+ gap: 8px;
1755
+ }
1756
+
1757
+ .cy-context-menu-header .node-title {
1758
+ color: var(--purple-light, #c084fc);
1759
+ font-family: var(--font-mono, monospace);
1760
+ white-space: nowrap;
1761
+ overflow: hidden;
1762
+ text-overflow: ellipsis;
1763
+ max-width: 150px;
1764
+ }
1765
+
1766
+ .cy-context-menu-item {
1767
+ display: flex;
1768
+ align-items: center;
1769
+ gap: 8px;
1770
+ padding: 7px 10px;
1771
+ border-radius: 6px;
1772
+ font-size: 0.82rem;
1773
+ font-weight: 500;
1774
+ color: var(--text-primary, #e2e8f0);
1775
+ background: transparent;
1776
+ border: none;
1777
+ cursor: pointer;
1778
+ text-align: left;
1779
+ width: 100%;
1780
+ transition: all 0.12s ease;
1781
+ }
1782
+
1783
+ .cy-context-menu-item:hover:not(:disabled) {
1784
+ background: rgba(140, 82, 255, 0.22);
1785
+ color: #ffffff;
1786
+ transform: translateX(2px);
1787
+ }
1788
+
1789
+ .cy-context-menu-item.primary {
1790
+ color: var(--cyan-accent, #00d4ff);
1791
+ font-weight: 600;
1792
+ }
1793
+
1794
+ .cy-context-menu-item.primary:hover:not(:disabled) {
1795
+ background: rgba(0, 212, 255, 0.18);
1796
+ color: #ffffff;
1797
+ }
1798
+
1799
+ .cy-context-menu-item:disabled {
1800
+ opacity: 0.45;
1801
+ cursor: not-allowed;
1802
+ pointer-events: none;
1803
+ }
1804
+
1805
+ .cy-context-menu-item .ui-icon {
1806
+ width: 15px;
1807
+ height: 15px;
1808
+ flex-shrink: 0;
1809
+ }
1810
+
1811
+ .cy-context-menu-divider {
1812
+ height: 1px;
1813
+ background: var(--border-card, rgba(255, 255, 255, 0.08));
1814
+ margin: 3px 2px;
1815
+ }
1816
+
1817
+ /* Spacebar Pan / Selection Mode Toast */
1818
+ .spacebar-pan-hint {
1819
+ position: absolute;
1820
+ top: 1.25rem;
1821
+ left: 50%;
1822
+ transform: translateX(-50%);
1823
+ background: rgba(25, 27, 38, 0.9);
1824
+ border: 1px solid var(--border-color);
1825
+ color: var(--purple-light);
1826
+ padding: 0.4rem 1rem;
1827
+ border-radius: 40px;
1828
+ font-size: 0.78rem;
1829
+ font-weight: 600;
1830
+ display: flex;
1831
+ align-items: center;
1832
+ gap: 0.45rem;
1833
+ pointer-events: none;
1834
+ backdrop-filter: blur(10px);
1835
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.6), 0 0 15px var(--purple-glow);
1836
+ opacity: 0;
1837
+ transition: opacity 0.2s ease, transform 0.2s ease;
1838
+ z-index: 85;
1839
+ }
1840
+
1841
+ .spacebar-pan-hint.visible {
1842
+ opacity: 1;
1843
+ transform: translateX(-50%) translateY(5px);
1844
+ }
1845
+
1846
+ /* Floating Graph Actions */
1847
+ .floating-controls {
1848
+ position: absolute;
1849
+ bottom: 1.5rem;
1850
+ left: 1.5rem;
1851
+ display: flex;
1852
+ flex-direction: column;
1853
+ gap: 0.65rem;
1854
+ z-index: 90;
1855
+ transition: left 0.3s cubic-bezier(0.4, 0, 0.2, 1), bottom 0.3s ease;
1856
+ }
1857
+
1858
+ .floating-actions-group {
1859
+ display: flex;
1860
+ flex-direction: column;
1861
+ gap: 0.5rem;
1862
+ }
1863
+
1864
+ .floating-btn {
1865
+ width: 42px;
1866
+ height: 42px;
1867
+ border-radius: 50%;
1868
+ background: rgba(25, 27, 38, 0.88);
1869
+ border: 1px solid var(--border-color);
1870
+ color: var(--text-white);
1871
+ font-size: 1.15rem;
1872
+ cursor: pointer;
1873
+ display: flex;
1874
+ align-items: center;
1875
+ justify-content: center;
1876
+ backdrop-filter: blur(10px);
1877
+ -webkit-backdrop-filter: blur(10px);
1878
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.6);
1879
+ transition: all 0.2s ease;
1880
+ touch-action: manipulation;
1881
+ }
1882
+
1883
+ .floating-btn:hover, .floating-btn:active {
1884
+ background: var(--purple-electric);
1885
+ border-color: var(--purple-electric);
1886
+ color: #fff;
1887
+ transform: scale(1.08);
1888
+ box-shadow: 0 0 18px var(--purple-glow-intense);
1889
+ }
1890
+
1891
+ .floating-layout-wrapper {
1892
+ position: relative;
1893
+ max-width: 195px;
1894
+ }
1895
+
1896
+ .floating-layout-select {
1897
+ background: rgba(25, 27, 38, 0.92);
1898
+ border: 1px solid var(--border-color);
1899
+ color: var(--text-primary);
1900
+ padding: 0.5rem 0.85rem;
1901
+ border-radius: 10px;
1902
+ font-size: 0.82rem;
1903
+ font-weight: 600;
1904
+ font-family: var(--font-main);
1905
+ cursor: pointer;
1906
+ backdrop-filter: blur(10px);
1907
+ -webkit-backdrop-filter: blur(10px);
1908
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.6);
1909
+ outline: none;
1910
+ transition: all 0.2s ease;
1911
+ width: 100%;
1912
+ }
1913
+
1914
+ .floating-layout-select:hover, .floating-layout-select:focus {
1915
+ background: var(--bg-card);
1916
+ border-color: var(--purple-electric);
1917
+ box-shadow: 0 0 14px var(--purple-glow);
1918
+ }
1919
+
1920
+ .floating-layout-select option {
1921
+ background: var(--bg-secondary);
1922
+ color: var(--text-primary);
1923
+ padding: 6px;
1924
+ }
1925
+
1926
+ .graph-loading {
1927
+ position: absolute;
1928
+ top: 50%;
1929
+ left: 50%;
1930
+ transform: translate(-50%, -50%);
1931
+ display: flex;
1932
+ flex-direction: column;
1933
+ align-items: center;
1934
+ gap: 1rem;
1935
+ color: var(--purple-light);
1936
+ font-weight: 500;
1937
+ z-index: 10;
1938
+ }
1939
+
1940
+ .spinner {
1941
+ width: 42px;
1942
+ height: 42px;
1943
+ border: 3px solid rgba(140, 82, 255, 0.15);
1944
+ border-top: 3px solid var(--purple-electric);
1945
+ border-radius: 50%;
1946
+ animation: spin 0.9s linear infinite;
1947
+ box-shadow: 0 0 14px var(--purple-glow);
1948
+ }
1949
+
1950
+ @keyframes spin {
1951
+ 0% { transform: rotate(0deg); }
1952
+ 100% { transform: rotate(360deg); }
1953
+ }
1954
+
1955
+ /* ==========================================================================
1956
+ Inspector Drawer
1957
+ ========================================================================== */
1958
+
1959
+ .inspector-drawer {
1960
+ position: fixed;
1961
+ right: -430px;
1962
+ top: 0;
1963
+ width: 430px;
1964
+ max-width: 100vw;
1965
+ height: 100vh;
1966
+ height: 100dvh;
1967
+ background: var(--bg-secondary);
1968
+ border-left: 1px solid var(--border-color);
1969
+ box-shadow: -8px 0 35px rgba(0, 0, 0, 0.8), 0 0 25px rgba(140, 82, 255, 0.12);
1970
+ transition: right 0.3s cubic-bezier(0.4, 0, 0.2, 1);
1971
+ z-index: 1000;
1972
+ display: flex;
1973
+ flex-direction: column;
1974
+ }
1975
+
1976
+ .inspector-drawer.open {
1977
+ right: 0;
1978
+ }
1979
+
1980
+ .inspector-header {
1981
+ background: var(--bg-card);
1982
+ padding: 1.15rem 1.5rem;
1983
+ border-bottom: 1px solid var(--border-color);
1984
+ display: flex;
1985
+ justify-content: space-between;
1986
+ align-items: center;
1987
+ flex-shrink: 0;
1988
+ }
1989
+
1990
+ .inspector-header h3 {
1991
+ color: var(--text-white);
1992
+ margin: 0;
1993
+ font-size: 1.1rem;
1994
+ font-weight: 700;
1995
+ overflow: hidden;
1996
+ text-overflow: ellipsis;
1997
+ white-space: nowrap;
1998
+ max-width: 80%;
1999
+ display: flex;
2000
+ align-items: center;
2001
+ gap: 0.5rem;
2002
+ }
2003
+
2004
+ .close-btn {
2005
+ background: var(--bg-secondary);
2006
+ border: 1px solid var(--border-card);
2007
+ color: var(--text-secondary);
2008
+ font-size: 1.3rem;
2009
+ cursor: pointer;
2010
+ width: 34px;
2011
+ height: 34px;
2012
+ display: flex;
2013
+ align-items: center;
2014
+ justify-content: center;
2015
+ border-radius: 8px;
2016
+ transition: all 0.2s ease;
2017
+ touch-action: manipulation;
2018
+ }
2019
+
2020
+ .close-btn:hover, .close-btn:active {
2021
+ background: var(--risk-critical);
2022
+ border-color: var(--risk-critical);
2023
+ color: #fff;
2024
+ box-shadow: 0 0 10px rgba(220, 20, 60, 0.4);
2025
+ }
2026
+
2027
+ .inspector-content {
2028
+ flex: 1;
2029
+ padding: 1.25rem 1.5rem;
2030
+ overflow-y: auto;
2031
+ color: var(--text-primary);
2032
+ line-height: 1.6;
2033
+ scrollbar-width: thin;
2034
+ scrollbar-color: rgba(140, 82, 255, 0.25) transparent;
2035
+ -webkit-overflow-scrolling: touch;
2036
+ }
2037
+
2038
+ .inspector-content h4 {
2039
+ color: var(--purple-light);
2040
+ margin: 1.2rem 0 0.65rem 0;
2041
+ border-bottom: 1px solid var(--border-color);
2042
+ padding-bottom: 0.35rem;
2043
+ font-size: 0.9rem;
2044
+ font-weight: 700;
2045
+ text-transform: uppercase;
2046
+ letter-spacing: 0.5px;
2047
+ }
2048
+
2049
+ .inspector-content h4:first-child {
2050
+ margin-top: 0;
2051
+ }
2052
+
2053
+ .inspector-content .property {
2054
+ display: flex;
2055
+ justify-content: space-between;
2056
+ align-items: center;
2057
+ gap: 0.75rem;
2058
+ margin: 0.5rem 0;
2059
+ padding: 0.65rem 0.85rem;
2060
+ background: var(--bg-card);
2061
+ border-radius: 8px;
2062
+ border: 1px solid var(--border-card);
2063
+ flex-wrap: wrap;
2064
+ overflow-wrap: anywhere;
2065
+ word-break: break-word;
2066
+ transition: border-color 0.2s ease;
2067
+ }
2068
+
2069
+ .inspector-content .property:hover {
2070
+ border-color: var(--border-color);
2071
+ }
2072
+
2073
+ .inspector-content .property .key {
2074
+ color: var(--text-secondary);
2075
+ font-weight: 500;
2076
+ font-size: 0.82rem;
2077
+ flex-shrink: 0;
2078
+ }
2079
+
2080
+ .inspector-content .property .value {
2081
+ color: var(--text-white);
2082
+ font-family: var(--font-mono);
2083
+ font-size: 0.85rem;
2084
+ max-width: 100%;
2085
+ overflow-wrap: anywhere;
2086
+ word-break: break-all;
2087
+ text-align: right;
2088
+ }
2089
+
2090
+ /* Vulnerability Badges in Inspector */
2091
+ .inspector-content .vulnerability-badge {
2092
+ display: inline-block;
2093
+ padding: 0.3rem 0.8rem;
2094
+ border-radius: 40px;
2095
+ font-size: 0.78rem;
2096
+ font-weight: 700;
2097
+ margin: 0.2rem;
2098
+ }
2099
+
2100
+ .vulnerability-badge.critical {
2101
+ background: rgba(220, 20, 60, 0.25);
2102
+ color: #ff4757;
2103
+ border: 1px solid var(--risk-critical);
2104
+ }
2105
+
2106
+ .vulnerability-badge.high {
2107
+ background: rgba(255, 107, 107, 0.2);
2108
+ color: #ff6b6b;
2109
+ border: 1px solid var(--risk-high);
2110
+ }
2111
+
2112
+ .vulnerability-badge.medium {
2113
+ background: rgba(255, 165, 2, 0.2);
2114
+ color: #ffa502;
2115
+ border: 1px solid var(--risk-medium);
2116
+ }
2117
+
2118
+ .vulnerability-badge.low {
2119
+ background: rgba(46, 213, 115, 0.2);
2120
+ color: #2ed573;
2121
+ border: 1px solid var(--risk-low);
2122
+ }
2123
+
2124
+ .vulnerability-badge.kev {
2125
+ background: rgba(139, 0, 0, 0.4);
2126
+ color: #ff7675;
2127
+ border: 1px solid var(--risk-critical);
2128
+ animation: pulse 2s infinite;
2129
+ }
2130
+
2131
+ @keyframes pulse {
2132
+ 0% { box-shadow: 0 0 0 0 rgba(220, 20, 60, 0.7); }
2133
+ 70% { box-shadow: 0 0 0 10px rgba(220, 20, 60, 0); }
2134
+ 100% { box-shadow: 0 0 0 0 rgba(220, 20, 60, 0); }
2135
+ }
2136
+
2137
+ /* Exploit / PoC Cards in Inspector */
2138
+ .exploit-item {
2139
+ background: var(--bg-card);
2140
+ border: 1px solid var(--border-card);
2141
+ border-radius: 8px;
2142
+ padding: 0.9rem;
2143
+ margin: 0.5rem 0;
2144
+ }
2145
+
2146
+ .exploit-header {
2147
+ display: flex;
2148
+ justify-content: space-between;
2149
+ align-items: center;
2150
+ margin-bottom: 0.5rem;
2151
+ }
2152
+
2153
+ .exploit-source {
2154
+ padding: 0.25rem 0.7rem;
2155
+ border-radius: 40px;
2156
+ font-size: 0.75rem;
2157
+ font-weight: 700;
2158
+ }
2159
+
2160
+ .exploit-source.github {
2161
+ background: #2d3436;
2162
+ color: #dfe6e9;
2163
+ border: 1px solid #636e72;
2164
+ }
2165
+
2166
+ .exploit-source.exploitdb {
2167
+ background: rgba(231, 76, 60, 0.25);
2168
+ color: #e74c3c;
2169
+ border: 1px solid #e74c3c;
2170
+ }
2171
+
2172
+ .exploit-badge.verified {
2173
+ background: rgba(39, 174, 96, 0.2);
2174
+ color: #2ecc71;
2175
+ padding: 0.2rem 0.6rem;
2176
+ border-radius: 40px;
2177
+ font-size: 0.7rem;
2178
+ border: 1px solid #27ae60;
2179
+ }
2180
+
2181
+ .exploit-title {
2182
+ font-weight: 600;
2183
+ color: var(--text-white);
2184
+ margin: 0.5rem 0;
2185
+ font-size: 0.88rem;
2186
+ }
2187
+
2188
+ .exploit-details {
2189
+ display: flex;
2190
+ flex-wrap: wrap;
2191
+ gap: 0.6rem;
2192
+ font-size: 0.8rem;
2193
+ color: var(--text-secondary);
2194
+ margin: 0.5rem 0;
2195
+ }
2196
+
2197
+ .exploit-details span {
2198
+ background: var(--bg-secondary);
2199
+ padding: 0.2rem 0.55rem;
2200
+ border-radius: 4px;
2201
+ border: 1px solid var(--border-card);
2202
+ font-family: var(--font-mono);
2203
+ font-size: 0.76rem;
2204
+ }
2205
+
2206
+ .exploit-url {
2207
+ margin-top: 0.5rem;
2208
+ }
2209
+
2210
+ .exploit-url a {
2211
+ color: var(--purple-light);
2212
+ text-decoration: none;
2213
+ font-size: 0.82rem;
2214
+ word-break: break-all;
2215
+ transition: color 0.2s ease;
2216
+ }
2217
+
2218
+ .exploit-url a:hover {
2219
+ color: var(--text-white);
2220
+ text-decoration: underline;
2221
+ }
2222
+
2223
+ /* ==========================================================================
2224
+ Risk Metrics Accordion & Detailed Cards
2225
+ ========================================================================== */
2226
+
2227
+ .risk-metrics-panel {
2228
+ margin-top: 1.25rem;
2229
+ padding-top: 0.5rem;
2230
+ border-top: 1px solid var(--border-color);
2231
+ }
2232
+
2233
+ .risk-metrics-heading {
2234
+ color: var(--purple-light) !important;
2235
+ font-size: 0.9rem !important;
2236
+ font-weight: 700 !important;
2237
+ margin-bottom: 0.75rem !important;
2238
+ border-bottom: 1px solid var(--border-color) !important;
2239
+ padding-bottom: 0.35rem !important;
2240
+ letter-spacing: 0.5px;
2241
+ text-transform: uppercase;
2242
+ }
2243
+
2244
+ .risk-accordion-group {
2245
+ margin-bottom: 0.55rem;
2246
+ border-radius: 8px;
2247
+ border: 1px solid var(--border-card);
2248
+ background: var(--bg-card);
2249
+ overflow: hidden;
2250
+ transition: border-color 0.2s ease;
2251
+ }
2252
+
2253
+ .risk-accordion-group:hover {
2254
+ border-color: var(--border-color);
2255
+ }
2256
+
2257
+ .risk-accordion-header {
2258
+ display: flex;
2259
+ justify-content: space-between;
2260
+ align-items: center;
2261
+ padding: 0.65rem 0.85rem;
2262
+ background: var(--bg-card);
2263
+ cursor: pointer;
2264
+ user-select: none;
2265
+ transition: background 0.2s ease;
2266
+ }
2267
+
2268
+ .risk-accordion-header:hover {
2269
+ background: var(--bg-card-hover);
2270
+ }
2271
+
2272
+ .risk-accordion-header.open {
2273
+ background: var(--bg-card-hover);
2274
+ border-bottom: 1px solid var(--border-color);
2275
+ }
2276
+
2277
+ .risk-accordion-title {
2278
+ display: flex;
2279
+ align-items: center;
2280
+ gap: 0.5rem;
2281
+ font-weight: 600;
2282
+ font-size: 0.86rem;
2283
+ color: var(--text-primary);
2284
+ }
2285
+
2286
+ .risk-accordion-title .accordion-icon {
2287
+ font-size: 1rem;
2288
+ line-height: 1;
2289
+ }
2290
+
2291
+ .risk-accordion-status {
2292
+ display: flex;
2293
+ align-items: center;
2294
+ gap: 0.5rem;
2295
+ }
2296
+
2297
+ .risk-pill-counter {
2298
+ display: inline-flex;
2299
+ align-items: center;
2300
+ justify-content: center;
2301
+ min-width: 24px;
2302
+ height: 20px;
2303
+ padding: 0 6px;
2304
+ border-radius: 10px;
2305
+ font-size: 0.75rem;
2306
+ font-weight: 700;
2307
+ font-family: var(--font-mono);
2308
+ background: var(--bg-secondary);
2309
+ color: var(--purple-light);
2310
+ border: 1px solid var(--border-color);
2311
+ }
2312
+
2313
+ .accordion-chevron {
2314
+ font-size: 0.7rem;
2315
+ color: var(--text-secondary);
2316
+ transition: transform 0.25s ease;
2317
+ }
2318
+
2319
+ .risk-accordion-header.open .accordion-chevron {
2320
+ transform: rotate(180deg);
2321
+ color: var(--purple-electric);
2322
+ }
2323
+
2324
+ .risk-accordion-body {
2325
+ padding: 0.65rem;
2326
+ background: var(--bg-secondary);
2327
+ max-height: 320px;
2328
+ overflow-y: auto;
2329
+ scrollbar-width: thin;
2330
+ scrollbar-color: rgba(140, 82, 255, 0.25) transparent;
2331
+ }
2332
+
2333
+ .risk-item-card {
2334
+ background: var(--bg-card);
2335
+ border: 1px solid var(--border-card);
2336
+ border-radius: 8px;
2337
+ padding: 0.65rem 0.8rem;
2338
+ margin-bottom: 0.5rem;
2339
+ transition: all 0.15s ease;
2340
+ }
2341
+
2342
+ .risk-item-card:last-child {
2343
+ margin-bottom: 0;
2344
+ }
2345
+
2346
+ .risk-item-card:hover {
2347
+ background: var(--bg-card-hover);
2348
+ border-color: var(--border-color);
2349
+ }
2350
+
2351
+ .risk-item-card.severity-critical {
2352
+ border-left: 3.5px solid var(--risk-critical);
2353
+ }
2354
+
2355
+ .risk-item-card.severity-high {
2356
+ border-left: 3.5px solid var(--risk-high);
2357
+ }
2358
+
2359
+ .risk-item-card.severity-medium {
2360
+ border-left: 3.5px solid var(--risk-medium);
2361
+ }
2362
+
2363
+ .risk-item-card.severity-low {
2364
+ border-left: 3.5px solid var(--risk-low);
2365
+ }
2366
+
2367
+ .risk-item-card.exploit-item-box {
2368
+ border-left: 3.5px solid #f39c12;
2369
+ }
2370
+
2371
+ .risk-item-card.service-item-box {
2372
+ border-left: 3.5px solid var(--purple-electric);
2373
+ }
2374
+
2375
+ .risk-card-top {
2376
+ display: flex;
2377
+ justify-content: space-between;
2378
+ align-items: flex-start;
2379
+ gap: 0.5rem;
2380
+ margin-bottom: 0.35rem;
2381
+ }
2382
+
2383
+ .risk-card-title {
2384
+ display: flex;
2385
+ flex-wrap: wrap;
2386
+ align-items: center;
2387
+ gap: 0.35rem;
2388
+ }
2389
+
2390
+ .cve-code {
2391
+ font-family: var(--font-mono);
2392
+ font-weight: 700;
2393
+ font-size: 0.85rem;
2394
+ color: var(--cyan-accent);
2395
+ }
2396
+
2397
+ .mini-badge {
2398
+ display: inline-flex;
2399
+ align-items: center;
2400
+ padding: 1px 6px;
2401
+ border-radius: 4px;
2402
+ font-size: 0.68rem;
2403
+ font-weight: 700;
2404
+ line-height: 1.3;
2405
+ }
2406
+
2407
+ .mini-badge.severity {
2408
+ text-transform: uppercase;
2409
+ }
2410
+
2411
+ .mini-badge.severity.critical {
2412
+ background: rgba(220, 20, 60, 0.25);
2413
+ color: #ff4757;
2414
+ border: 1px solid var(--risk-critical);
2415
+ }
2416
+
2417
+ .mini-badge.severity.high {
2418
+ background: rgba(255, 107, 107, 0.2);
2419
+ color: #ff6b6b;
2420
+ border: 1px solid var(--risk-high);
2421
+ }
2422
+
2423
+ .mini-badge.severity.medium {
2424
+ background: rgba(255, 165, 2, 0.2);
2425
+ color: #ffa502;
2426
+ border: 1px solid var(--risk-medium);
2427
+ }
2428
+
2429
+ .mini-badge.severity.low {
2430
+ background: rgba(46, 213, 115, 0.2);
2431
+ color: #2ed573;
2432
+ border: 1px solid var(--risk-low);
2433
+ }
2434
+
2435
+ .mini-badge.kev {
2436
+ background: rgba(139, 0, 0, 0.4);
2437
+ color: #ff7675;
2438
+ border: 1px solid var(--risk-critical);
2439
+ }
2440
+
2441
+ .mini-badge.poc {
2442
+ background: rgba(243, 156, 18, 0.2);
2443
+ color: #f39c12;
2444
+ border: 1px solid #f39c12;
2445
+ }
2446
+
2447
+ .mini-badge.github {
2448
+ background: #2d3436;
2449
+ color: #dfe6e9;
2450
+ border: 1px solid #636e72;
2451
+ }
2452
+
2453
+ .mini-badge.exploitdb {
2454
+ background: rgba(231, 76, 60, 0.25);
2455
+ color: #e74c3c;
2456
+ border: 1px solid #e74c3c;
2457
+ }
2458
+
2459
+ .mini-badge.verified {
2460
+ background: rgba(39, 174, 96, 0.2);
2461
+ color: #2ecc71;
2462
+ border: 1px solid #27ae60;
2463
+ }
2464
+
2465
+ .risk-card-metrics {
2466
+ display: flex;
2467
+ flex-wrap: wrap;
2468
+ gap: 0.5rem;
2469
+ margin: 0.3rem 0;
2470
+ font-size: 0.78rem;
2471
+ }
2472
+
2473
+ .metric-pill {
2474
+ background: var(--bg-secondary);
2475
+ padding: 2px 6px;
2476
+ border-radius: 4px;
2477
+ color: var(--text-secondary);
2478
+ font-family: var(--font-mono);
2479
+ font-size: 0.74rem;
2480
+ border: 1px solid var(--border-card);
2481
+ }
2482
+
2483
+ .risk-card-desc {
2484
+ font-size: 0.78rem;
2485
+ color: var(--text-secondary);
2486
+ line-height: 1.35;
2487
+ margin: 0.35rem 0;
2488
+ display: -webkit-box;
2489
+ -webkit-line-clamp: 2;
2490
+ -webkit-box-orient: vertical;
2491
+ overflow: hidden;
2492
+ text-overflow: ellipsis;
2493
+ }
2494
+
2495
+ .exploit-title-text {
2496
+ font-size: 0.82rem;
2497
+ color: var(--text-white);
2498
+ font-weight: 500;
2499
+ margin: 0.35rem 0;
2500
+ word-break: break-word;
2501
+ }
2502
+
2503
+ .risk-card-meta-tags {
2504
+ display: flex;
2505
+ flex-wrap: wrap;
2506
+ gap: 0.4rem;
2507
+ margin: 0.35rem 0;
2508
+ }
2509
+
2510
+ .meta-tag {
2511
+ background: var(--bg-secondary);
2512
+ color: var(--text-secondary);
2513
+ font-size: 0.72rem;
2514
+ padding: 1px 6px;
2515
+ border-radius: 4px;
2516
+ border: 1px solid var(--border-card);
2517
+ font-family: var(--font-mono);
2518
+ }
2519
+
2520
+ .risk-card-links {
2521
+ display: flex;
2522
+ flex-wrap: wrap;
2523
+ gap: 0.4rem;
2524
+ margin-top: 0.4rem;
2525
+ padding-top: 0.35rem;
2526
+ border-top: 1px solid var(--border-card);
2527
+ }
2528
+
2529
+ .risk-link-btn {
2530
+ display: inline-flex;
2531
+ align-items: center;
2532
+ padding: 2px 8px;
2533
+ border-radius: 4px;
2534
+ font-size: 0.74rem;
2535
+ font-weight: 600;
2536
+ color: var(--cyan-accent);
2537
+ background: rgba(0, 229, 255, 0.08);
2538
+ border: 1px solid rgba(0, 229, 255, 0.3);
2539
+ text-decoration: none;
2540
+ transition: all 0.15s ease;
2541
+ }
2542
+
2543
+ .risk-link-btn:hover {
2544
+ background: rgba(0, 229, 255, 0.22);
2545
+ color: #fff;
2546
+ box-shadow: 0 0 8px var(--cyan-glow);
2547
+ }
2548
+
2549
+ .risk-link-btn.primary {
2550
+ color: #f59e0b;
2551
+ background: rgba(243, 156, 18, 0.1);
2552
+ border-color: rgba(243, 156, 18, 0.35);
2553
+ }
2554
+
2555
+ .risk-link-btn.primary:hover {
2556
+ background: rgba(243, 156, 18, 0.25);
2557
+ color: #fff;
2558
+ }
2559
+
2560
+ .risk-focus-btn {
2561
+ display: inline-flex;
2562
+ align-items: center;
2563
+ padding: 2px 8px;
2564
+ border-radius: 4px;
2565
+ font-size: 0.74rem;
2566
+ font-weight: 600;
2567
+ color: var(--purple-light);
2568
+ background: rgba(140, 82, 255, 0.12);
2569
+ border: 1px solid rgba(140, 82, 255, 0.35);
2570
+ cursor: pointer;
2571
+ transition: all 0.15s ease;
2572
+ }
2573
+
2574
+ .risk-focus-btn:hover {
2575
+ background: var(--purple-electric);
2576
+ color: #fff;
2577
+ box-shadow: 0 0 10px var(--purple-glow);
2578
+ }
2579
+
2580
+ .risk-item-empty {
2581
+ padding: 0.75rem;
2582
+ text-align: center;
2583
+ font-size: 0.8rem;
2584
+ color: var(--text-muted);
2585
+ font-style: italic;
2586
+ }
2587
+
2588
+ /* ==========================================================================
2589
+ Responsive Design & Breakpoints
2590
+ ========================================================================== */
2591
+
2592
+ /* Laptops and medium screens (<= 1200px) */
2593
+ @media (max-width: 1200px) {
2594
+ .panel {
2595
+ padding: 1rem;
2596
+ }
2597
+
2598
+ .inspector-drawer {
2599
+ width: 390px;
2600
+ }
2601
+
2602
+ .metric-grid {
2603
+ grid-template-columns: repeat(2, 1fr);
2604
+ gap: 0.5rem;
2605
+ }
2606
+
2607
+ .metric-item {
2608
+ padding: 0.5rem 0.35rem;
2609
+ min-height: 60px;
2610
+ }
2611
+
2612
+ .metric-value {
2613
+ font-size: 1.12rem;
2614
+ }
2615
+ }
2616
+
2617
+ /* Tablets and small laptops (<= 992px) */
2618
+ @media (max-width: 992px) {
2619
+ .sidebar-toggle-btn {
2620
+ display: inline-flex;
2621
+ }
2622
+
2623
+ .sidebar {
2624
+ position: fixed;
2625
+ top: 0;
2626
+ left: -350px;
2627
+ width: 320px;
2628
+ max-width: 85vw;
2629
+ height: 100vh;
2630
+ height: 100dvh;
2631
+ z-index: 999;
2632
+ box-shadow: 8px 0 35px rgba(0, 0, 0, 0.85);
2633
+ padding: 1.25rem;
2634
+ transition: left 0.3s cubic-bezier(0.4, 0, 0.2, 1);
2635
+ }
2636
+
2637
+ .sidebar.open {
2638
+ left: 0;
2639
+ }
2640
+
2641
+ .sidebar-mobile-header {
2642
+ display: flex;
2643
+ }
2644
+
2645
+ .dashboard-main {
2646
+ flex-direction: row;
2647
+ }
2648
+
2649
+ .inspector-drawer {
2650
+ width: 380px;
2651
+ max-width: 90vw;
2652
+ }
2653
+ }
2654
+
2655
+ /* Mobile & Small Tablets (<= 768px) */
2656
+ @media (max-width: 768px) {
2657
+ .header-content {
2658
+ gap: 0.6rem;
2659
+ flex-wrap: wrap;
2660
+ padding: 0.6rem 0.85rem;
2661
+ }
2662
+
2663
+ .header-right {
2664
+ gap: 0.5rem;
2665
+ flex-wrap: wrap;
2666
+ width: 100%;
2667
+ justify-content: flex-end;
2668
+ }
2669
+
2670
+ .control-label {
2671
+ display: inline-flex;
2672
+ }
2673
+
2674
+ .db-select-input {
2675
+ max-width: 140px;
2676
+ font-size: 0.78rem;
2677
+ padding: 0.35rem 0.5rem;
2678
+ }
2679
+
2680
+ .action-btn.export-btn {
2681
+ padding: 0.35rem 0.65rem;
2682
+ font-size: 0.78rem;
2683
+ }
2684
+
2685
+ .brand-title {
2686
+ font-size: 1.15rem;
2687
+ }
2688
+
2689
+ .brand-subtitle {
2690
+ font-size: 0.62rem;
2691
+ display: block;
2692
+ }
2693
+
2694
+ .brand-logo {
2695
+ width: 28px;
2696
+ height: 28px;
2697
+ }
2698
+
2699
+ .header-docs-icon-btn {
2700
+ width: 30px;
2701
+ height: 30px;
2702
+ margin-left: 0.35rem;
2703
+ }
2704
+
2705
+ .target-info {
2706
+ display: none;
2707
+ }
2708
+
2709
+ .sidebar {
2710
+ width: 310px;
2711
+ max-width: 88vw;
2712
+ }
2713
+
2714
+ .inspector-drawer {
2715
+ width: 100%;
2716
+ max-width: 100vw;
2717
+ right: -100%;
2718
+ border-left: none;
2719
+ }
2720
+
2721
+ .inspector-drawer.open {
2722
+ right: 0;
2723
+ }
2724
+
2725
+ .targets-drawer {
2726
+ width: 100%;
2727
+ max-width: 100vw;
2728
+ right: -100%;
2729
+ border-left: none;
2730
+ }
2731
+
2732
+ .targets-drawer.open {
2733
+ right: 0;
2734
+ }
2735
+
2736
+ .targets-drawer-trigger-btn {
2737
+ padding: 0.35rem 0.65rem;
2738
+ font-size: 0.78rem;
2739
+ }
2740
+
2741
+ .inspector-header {
2742
+ padding: 1rem 1.15rem;
2743
+ }
2744
+
2745
+ .inspector-content {
2746
+ padding: 1rem 1.15rem;
2747
+ }
2748
+
2749
+ .floating-controls {
2750
+ bottom: 1rem;
2751
+ left: 1rem;
2752
+ }
2753
+
2754
+ .floating-btn {
2755
+ width: 38px;
2756
+ height: 38px;
2757
+ font-size: 1rem;
2758
+ }
2759
+
2760
+ .floating-layout-select {
2761
+ font-size: 0.75rem;
2762
+ padding: 0.35rem 0.5rem;
2763
+ }
2764
+
2765
+ .spacebar-pan-hint {
2766
+ display: none;
2767
+ }
2768
+ }
2769
+
2770
+ /* Extra small mobile phones (<= 480px) */
2771
+ @media (max-width: 480px) {
2772
+ .header-content {
2773
+ padding: 0.5rem 0.6rem;
2774
+ }
2775
+
2776
+ .header-brand {
2777
+ gap: 0.45rem;
2778
+ }
2779
+
2780
+ .brand-title {
2781
+ font-size: 1.05rem;
2782
+ }
2783
+
2784
+ .brand-subtitle {
2785
+ font-size: 0.58rem;
2786
+ }
2787
+
2788
+ .header-docs-icon-btn {
2789
+ width: 28px;
2790
+ height: 28px;
2791
+ margin-left: 0.25rem;
2792
+ }
2793
+
2794
+ .header-right {
2795
+ width: auto;
2796
+ margin-left: auto;
2797
+ gap: 0.35rem;
2798
+ }
2799
+
2800
+ .db-select-input {
2801
+ max-width: 110px;
2802
+ font-size: 0.72rem;
2803
+ padding: 0.3rem 0.4rem;
2804
+ }
2805
+
2806
+ .action-btn.export-btn {
2807
+ padding: 0.3rem 0.45rem;
2808
+ font-size: 0.72rem;
2809
+ }
2810
+
2811
+ .targets-drawer-trigger-btn {
2812
+ padding: 0.3rem 0.45rem;
2813
+ font-size: 0.72rem;
2814
+ }
2815
+
2816
+ .export-dropdown-menu {
2817
+ right: 0;
2818
+ min-width: 200px;
2819
+ }
2820
+
2821
+ .metric-grid {
2822
+ grid-template-columns: repeat(2, 1fr);
2823
+ }
2824
+
2825
+ .sidebar {
2826
+ width: 100%;
2827
+ max-width: 100vw;
2828
+ left: -100%;
2829
+ }
2830
+
2831
+ .sidebar.open {
2832
+ left: 0;
2833
+ }
2834
+
2835
+ .search-input {
2836
+ font-size: 0.82rem;
2837
+ padding: 0.6rem 0.6rem 0.6rem 2.2rem;
2838
+ }
2839
+
2840
+ .targets-drawer-content {
2841
+ padding: 0.85rem;
2842
+ gap: 0.85rem;
2843
+ }
2844
+
2845
+ .preset-btn {
2846
+ padding: 0.4rem;
2847
+ font-size: 0.72rem;
2848
+ }
2849
+ }
2850
+
2851
+ /* ==========================================================================
2852
+ Target Management Drawer & Active Scan (Masscan) Component Styles
2853
+ ========================================================================== */
2854
+
2855
+ /* Header Trigger Button */
2856
+ .targets-drawer-trigger-btn {
2857
+ background: rgba(140, 82, 255, 0.15);
2858
+ border: 1px solid rgba(140, 82, 255, 0.35);
2859
+ color: var(--text-white);
2860
+ display: inline-flex;
2861
+ align-items: center;
2862
+ gap: 0.45rem;
2863
+ padding: 0.45rem 0.85rem;
2864
+ border-radius: 8px;
2865
+ font-size: 0.84rem;
2866
+ font-weight: 600;
2867
+ cursor: pointer;
2868
+ transition: all 0.25s ease;
2869
+ position: relative;
2870
+ }
2871
+
2872
+ .targets-drawer-trigger-btn:hover {
2873
+ background: var(--purple-electric);
2874
+ border-color: var(--purple-electric);
2875
+ box-shadow: 0 0 14px var(--purple-glow);
2876
+ color: #fff;
2877
+ }
2878
+
2879
+ .targets-drawer-trigger-btn.active {
2880
+ background: var(--purple-electric);
2881
+ border-color: #fff;
2882
+ box-shadow: 0 0 16px var(--purple-glow);
2883
+ color: #fff;
2884
+ }
2885
+
2886
+ .targets-drawer-trigger-btn.is-scanning {
2887
+ background: rgba(0, 240, 255, 0.18);
2888
+ border-color: #00f0ff;
2889
+ box-shadow: 0 0 16px rgba(0, 240, 255, 0.4);
2890
+ color: #00f0ff;
2891
+ }
2892
+
2893
+ .targets-drawer-trigger-btn.is-scanning .target-scan-indicator {
2894
+ display: inline-flex;
2895
+ align-items: center;
2896
+ gap: 0.3rem;
2897
+ font-size: 0.72rem;
2898
+ font-weight: 700;
2899
+ color: #00f0ff;
2900
+ background: rgba(0, 240, 255, 0.15);
2901
+ border: 1px solid rgba(0, 240, 255, 0.4);
2902
+ padding: 0.1rem 0.45rem;
2903
+ border-radius: 10px;
2904
+ letter-spacing: 0.3px;
2905
+ animation: scanPulse 1.4s ease-in-out infinite;
2906
+ }
2907
+
2908
+ .target-scan-pulse-dot {
2909
+ width: 6px;
2910
+ height: 6px;
2911
+ border-radius: 50%;
2912
+ background: #00f0ff;
2913
+ box-shadow: 0 0 8px #00f0ff;
2914
+ animation: dotBlink 1s infinite alternate;
2915
+ }
2916
+
2917
+ @keyframes scanPulse {
2918
+ 0% {
2919
+ box-shadow: 0 0 0 0 rgba(0, 240, 255, 0.6);
2920
+ }
2921
+ 70% {
2922
+ box-shadow: 0 0 0 7px rgba(0, 240, 255, 0);
2923
+ }
2924
+ 100% {
2925
+ box-shadow: 0 0 0 0 rgba(0, 240, 255, 0);
2926
+ }
2927
+ }
2928
+
2929
+ @keyframes dotBlink {
2930
+ 0% { opacity: 0.3; transform: scale(0.85); }
2931
+ 100% { opacity: 1; transform: scale(1.15); }
2932
+ }
2933
+
2934
+ .target-count-badge {
2935
+ background: #00f0ff;
2936
+ color: #0b0f19;
2937
+ font-size: 0.72rem;
2938
+ font-weight: 700;
2939
+ padding: 0.1rem 0.45rem;
2940
+ border-radius: 10px;
2941
+ margin-left: 0.2rem;
2942
+ letter-spacing: 0.2px;
2943
+ }
2944
+
2945
+ /* Target Management Drawer (Right Drawer) */
2946
+ .targets-drawer {
2947
+ position: fixed;
2948
+ top: var(--header-height, 60px);
2949
+ right: 0;
2950
+ width: 680px;
2951
+ max-width: 95vw;
2952
+ height: calc(100vh - var(--header-height, 60px));
2953
+ background: var(--bg-primary);
2954
+ border-left: 1px solid var(--border-color);
2955
+ box-shadow: -6px 0 25px rgba(0, 0, 0, 0.65);
2956
+ z-index: 1050;
2957
+ transform: translateX(105%);
2958
+ transition: transform 0.35s cubic-bezier(0.16, 1, 0.3, 1);
2959
+ display: flex;
2960
+ flex-direction: column;
2961
+ overflow: hidden;
2962
+ }
2963
+
2964
+ .targets-drawer.open {
2965
+ transform: translateX(0);
2966
+ }
2967
+
2968
+ .targets-drawer-header {
2969
+ display: flex;
2970
+ justify-content: space-between;
2971
+ align-items: center;
2972
+ padding: 1rem 1.25rem;
2973
+ background: var(--bg-secondary);
2974
+ border-bottom: 1px solid var(--border-color);
2975
+ flex-shrink: 0;
2976
+ }
2977
+
2978
+ .targets-header-actions {
2979
+ display: flex;
2980
+ align-items: center;
2981
+ gap: 0.5rem;
2982
+ }
2983
+
2984
+ .drawer-action-btn {
2985
+ background: transparent;
2986
+ border: 1px solid var(--border-color);
2987
+ color: var(--text-secondary);
2988
+ border-radius: 6px;
2989
+ width: 32px;
2990
+ height: 32px;
2991
+ display: flex;
2992
+ align-items: center;
2993
+ justify-content: center;
2994
+ cursor: pointer;
2995
+ transition: all 0.2s ease;
2996
+ }
2997
+
2998
+ .drawer-action-btn:hover {
2999
+ background: rgba(140, 82, 255, 0.15);
3000
+ border-color: var(--purple-electric);
3001
+ color: var(--text-white);
3002
+ }
3003
+
3004
+ .targets-header-title {
3005
+ display: flex;
3006
+ align-items: center;
3007
+ gap: 0.6rem;
3008
+ }
3009
+
3010
+ .targets-header-icon {
3011
+ color: #00f0ff;
3012
+ width: 20px;
3013
+ height: 20px;
3014
+ }
3015
+
3016
+ .targets-drawer-header h3 {
3017
+ margin: 0;
3018
+ font-size: 1.05rem;
3019
+ font-weight: 700;
3020
+ color: var(--text-white);
3021
+ }
3022
+
3023
+ .targets-counter {
3024
+ font-size: 0.75rem;
3025
+ background: rgba(0, 240, 255, 0.12);
3026
+ color: #00f0ff;
3027
+ border: 1px solid rgba(0, 240, 255, 0.3);
3028
+ padding: 0.15rem 0.5rem;
3029
+ border-radius: 12px;
3030
+ font-weight: 600;
3031
+ }
3032
+
3033
+ /* Navigation Tabs */
3034
+ .targets-drawer-tabs {
3035
+ display: flex;
3036
+ background: var(--bg-card);
3037
+ border-bottom: 1px solid var(--border-color);
3038
+ padding: 0.25rem 0.5rem 0;
3039
+ gap: 0.35rem;
3040
+ flex-shrink: 0;
3041
+ overflow-x: auto;
3042
+ scrollbar-width: none;
3043
+ }
3044
+
3045
+ .targets-drawer-tabs::-webkit-scrollbar {
3046
+ display: none;
3047
+ }
3048
+
3049
+ .drawer-tab-btn {
3050
+ flex: 1;
3051
+ min-width: fit-content;
3052
+ display: inline-flex;
3053
+ align-items: center;
3054
+ justify-content: center;
3055
+ gap: 0.45rem;
3056
+ padding: 0.65rem 0.85rem;
3057
+ background: transparent;
3058
+ border: none;
3059
+ border-bottom: 2px solid transparent;
3060
+ color: var(--text-secondary);
3061
+ font-size: 0.82rem;
3062
+ font-weight: 600;
3063
+ cursor: pointer;
3064
+ transition: all 0.2s ease;
3065
+ white-space: nowrap;
3066
+ }
3067
+
3068
+ .drawer-tab-btn .tab-icon {
3069
+ width: 15px;
3070
+ height: 15px;
3071
+ }
3072
+
3073
+ .drawer-tab-btn:hover {
3074
+ color: var(--text-white);
3075
+ background: rgba(140, 82, 255, 0.08);
3076
+ border-radius: 6px 6px 0 0;
3077
+ }
3078
+
3079
+ .drawer-tab-btn.active {
3080
+ color: #00f0ff;
3081
+ border-bottom: 2px solid #00f0ff;
3082
+ background: rgba(0, 240, 255, 0.06);
3083
+ border-radius: 6px 6px 0 0;
3084
+ }
3085
+
3086
+ .targets-drawer-content {
3087
+ flex: 1;
3088
+ overflow-y: auto;
3089
+ padding: 1.25rem;
3090
+ display: flex;
3091
+ flex-direction: column;
3092
+ gap: 1.25rem;
3093
+ scrollbar-width: thin;
3094
+ scrollbar-color: rgba(140, 82, 255, 0.3) transparent;
3095
+ }
3096
+
3097
+ .drawer-tab-pane {
3098
+ display: flex;
3099
+ flex-direction: column;
3100
+ gap: 1.25rem;
3101
+ }
3102
+
3103
+ /* Global Actions */
3104
+ .targets-global-actions {
3105
+ display: flex;
3106
+ gap: 0.65rem;
3107
+ }
3108
+
3109
+ .btn-primary-action {
3110
+ flex: 1;
3111
+ background: linear-gradient(135deg, #8C52FF 0%, #6d28d9 100%);
3112
+ color: #fff;
3113
+ border: 1px solid rgba(255, 255, 255, 0.2);
3114
+ border-radius: 8px;
3115
+ padding: 0.65rem 1rem;
3116
+ font-size: 0.88rem;
3117
+ font-weight: 600;
3118
+ cursor: pointer;
3119
+ display: inline-flex;
3120
+ align-items: center;
3121
+ justify-content: center;
3122
+ gap: 0.5rem;
3123
+ transition: all 0.25s ease;
3124
+ box-shadow: 0 4px 12px rgba(140, 82, 255, 0.35);
3125
+ }
3126
+
3127
+ .btn-primary-action:hover {
3128
+ background: linear-gradient(135deg, #9d6aff 0%, #7c3aed 100%);
3129
+ box-shadow: 0 0 18px var(--purple-glow);
3130
+ transform: translateY(-1px);
3131
+ }
3132
+
3133
+ .btn-primary-action.btn-scan-stopping {
3134
+ background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%) !important;
3135
+ border-color: rgba(245, 158, 11, 0.4) !important;
3136
+ box-shadow: 0 4px 12px rgba(245, 158, 11, 0.35) !important;
3137
+ color: #fff !important;
3138
+ }
3139
+
3140
+ .btn-primary-action.btn-scan-stopping:hover {
3141
+ background: linear-gradient(135deg, #fbbf24 0%, #b45309 100%) !important;
3142
+ box-shadow: 0 0 18px rgba(245, 158, 11, 0.5) !important;
3143
+ }
3144
+
3145
+ .btn-nuclei-action.btn-scan-stopping {
3146
+ background: linear-gradient(135deg, #ef4444 0%, #b91c1c 100%) !important;
3147
+ border-color: rgba(239, 68, 68, 0.4) !important;
3148
+ box-shadow: 0 4px 12px rgba(239, 68, 68, 0.35) !important;
3149
+ color: #fff !important;
3150
+ }
3151
+
3152
+ .btn-nuclei-action.btn-scan-stopping:hover {
3153
+ background: linear-gradient(135deg, #f87171 0%, #991b1b 100%) !important;
3154
+ box-shadow: 0 0 18px rgba(239, 68, 68, 0.5) !important;
3155
+ }
3156
+
3157
+ .btn-primary-action:disabled {
3158
+ opacity: 0.5;
3159
+ cursor: not-allowed;
3160
+ transform: none;
3161
+ box-shadow: none;
3162
+ }
3163
+
3164
+ .btn-secondary-action {
3165
+ background: var(--bg-card);
3166
+ color: var(--text-secondary);
3167
+ border: 1px solid var(--border-color);
3168
+ border-radius: 8px;
3169
+ padding: 0.65rem 0.85rem;
3170
+ font-size: 0.85rem;
3171
+ font-weight: 500;
3172
+ cursor: pointer;
3173
+ display: inline-flex;
3174
+ align-items: center;
3175
+ justify-content: center;
3176
+ gap: 0.4rem;
3177
+ transition: all 0.2s ease;
3178
+ }
3179
+
3180
+ .btn-secondary-action:hover {
3181
+ background: rgba(239, 68, 68, 0.15);
3182
+ border-color: rgba(239, 68, 68, 0.4);
3183
+ color: #ef4444;
3184
+ }
3185
+
3186
+ /* Sections */
3187
+ .targets-section {
3188
+ background: var(--bg-secondary);
3189
+ border: 1px solid var(--border-color);
3190
+ border-radius: 10px;
3191
+ padding: 1rem;
3192
+ display: flex;
3193
+ flex-direction: column;
3194
+ gap: 0.85rem;
3195
+ }
3196
+
3197
+ .targets-section-title {
3198
+ display: flex;
3199
+ align-items: center;
3200
+ gap: 0.5rem;
3201
+ font-size: 0.88rem;
3202
+ font-weight: 700;
3203
+ color: var(--text-primary);
3204
+ text-transform: uppercase;
3205
+ letter-spacing: 0.5px;
3206
+ padding-bottom: 0.45rem;
3207
+ border-bottom: 1px solid var(--border-color);
3208
+ }
3209
+
3210
+ .targets-section-title i,
3211
+ .targets-section-title svg {
3212
+ color: var(--purple-light);
3213
+ width: 16px;
3214
+ height: 16px;
3215
+ }
3216
+
3217
+ /* Empty State */
3218
+ .targets-empty-state {
3219
+ text-align: center;
3220
+ padding: 1.5rem 0.8rem;
3221
+ color: var(--text-muted);
3222
+ display: flex;
3223
+ flex-direction: column;
3224
+ align-items: center;
3225
+ gap: 0.4rem;
3226
+ }
3227
+
3228
+ .empty-icon {
3229
+ width: 32px;
3230
+ height: 32px;
3231
+ color: var(--text-muted);
3232
+ opacity: 0.6;
3233
+ margin-bottom: 0.2rem;
3234
+ }
3235
+
3236
+ .targets-empty-state p {
3237
+ margin: 0;
3238
+ font-size: 0.88rem;
3239
+ font-weight: 600;
3240
+ color: var(--text-secondary);
3241
+ }
3242
+
3243
+ .empty-hint {
3244
+ font-size: 0.76rem;
3245
+ line-height: 1.4;
3246
+ color: var(--text-muted);
3247
+ }
3248
+
3249
+ .empty-hint strong {
3250
+ color: #00f0ff;
3251
+ }
3252
+
3253
+ /* Target List Items */
3254
+ .targets-items-list {
3255
+ display: flex;
3256
+ flex-direction: column;
3257
+ gap: 0.55rem;
3258
+ max-height: 16rem;
3259
+ overflow-y: auto;
3260
+ padding-right: 0.2rem;
3261
+ scrollbar-width: thin;
3262
+ }
3263
+
3264
+ .target-card-item {
3265
+ display: flex;
3266
+ align-items: center;
3267
+ justify-content: space-between;
3268
+ background: var(--bg-card);
3269
+ border: 1px solid var(--border-card);
3270
+ border-radius: 8px;
3271
+ padding: 0.65rem 0.8rem;
3272
+ transition: all 0.2s ease;
3273
+ }
3274
+
3275
+ .target-card-item:hover {
3276
+ border-color: rgba(140, 82, 255, 0.4);
3277
+ background: rgba(140, 82, 255, 0.05);
3278
+ }
3279
+
3280
+ .target-card-left {
3281
+ display: flex;
3282
+ flex-direction: column;
3283
+ gap: 0.25rem;
3284
+ min-width: 0;
3285
+ }
3286
+
3287
+ .target-card-ip-row {
3288
+ display: flex;
3289
+ align-items: center;
3290
+ gap: 0.5rem;
3291
+ }
3292
+
3293
+ .target-card-ip {
3294
+ font-family: 'JetBrains Mono', monospace;
3295
+ font-size: 0.88rem;
3296
+ font-weight: 700;
3297
+ color: var(--text-white);
3298
+ }
3299
+
3300
+ .target-status-tag {
3301
+ font-size: 0.68rem;
3302
+ font-weight: 700;
3303
+ text-transform: uppercase;
3304
+ padding: 0.1rem 0.4rem;
3305
+ border-radius: 4px;
3306
+ letter-spacing: 0.4px;
3307
+ }
3308
+
3309
+ .target-status-tag.idle {
3310
+ background: rgba(148, 163, 184, 0.15);
3311
+ color: #94a3b8;
3312
+ border: 1px solid rgba(148, 163, 184, 0.3);
3313
+ }
3314
+
3315
+ .target-status-tag.scanning {
3316
+ background: rgba(0, 240, 255, 0.15);
3317
+ color: #00f0ff;
3318
+ border: 1px solid rgba(0, 240, 255, 0.4);
3319
+ animation: target-pulse 1.5s infinite;
3320
+ }
3321
+
3322
+ .target-status-tag.completed {
3323
+ background: rgba(34, 197, 94, 0.15);
3324
+ color: #22c55e;
3325
+ border: 1px solid rgba(34, 197, 94, 0.4);
3326
+ }
3327
+
3328
+ .target-status-tag.failed {
3329
+ background: rgba(239, 68, 68, 0.15);
3330
+ color: #ef4444;
3331
+ border: 1px solid rgba(239, 68, 68, 0.4);
3332
+ }
3333
+
3334
+ @keyframes target-pulse {
3335
+ 0%, 100% { opacity: 1; }
3336
+ 50% { opacity: 0.5; }
3337
+ }
3338
+
3339
+ .target-card-meta {
3340
+ font-size: 0.74rem;
3341
+ color: var(--text-muted);
3342
+ display: flex;
3343
+ align-items: center;
3344
+ gap: 0.6rem;
3345
+ }
3346
+
3347
+ .target-card-actions {
3348
+ display: flex;
3349
+ align-items: center;
3350
+ gap: 0.35rem;
3351
+ }
3352
+
3353
+ .target-item-btn {
3354
+ background: transparent;
3355
+ border: 1px solid var(--border-color);
3356
+ color: var(--text-secondary);
3357
+ width: 28px;
3358
+ height: 28px;
3359
+ border-radius: 6px;
3360
+ cursor: pointer;
3361
+ display: flex;
3362
+ align-items: center;
3363
+ justify-content: center;
3364
+ transition: all 0.2s ease;
3365
+ }
3366
+
3367
+ .target-item-btn:hover {
3368
+ background: var(--purple-electric);
3369
+ color: #fff;
3370
+ border-color: var(--purple-electric);
3371
+ }
3372
+
3373
+ .target-item-btn.btn-remove:hover {
3374
+ background: #ef4444;
3375
+ border-color: #ef4444;
3376
+ color: #fff;
3377
+ }
3378
+
3379
+ /* Preset Buttons */
3380
+ .preset-buttons-group {
3381
+ display: grid;
3382
+ grid-template-columns: repeat(2, 1fr);
3383
+ gap: 0.45rem;
3384
+ }
3385
+
3386
+ .preset-btn {
3387
+ background: var(--bg-card);
3388
+ border: 1px solid var(--border-color);
3389
+ color: var(--text-secondary);
3390
+ padding: 0.45rem 0.5rem;
3391
+ border-radius: 6px;
3392
+ font-size: 0.78rem;
3393
+ font-weight: 600;
3394
+ cursor: pointer;
3395
+ transition: all 0.2s ease;
3396
+ text-align: center;
3397
+ }
3398
+
3399
+ .preset-btn:hover {
3400
+ background: rgba(140, 82, 255, 0.15);
3401
+ border-color: var(--purple-electric);
3402
+ color: var(--text-white);
3403
+ }
3404
+
3405
+ .preset-btn.active {
3406
+ background: var(--purple-electric);
3407
+ border-color: var(--purple-electric);
3408
+ color: #fff;
3409
+ box-shadow: 0 0 10px var(--purple-glow);
3410
+ }
3411
+
3412
+ /* Form Controls in Drawer */
3413
+ .form-group {
3414
+ display: flex;
3415
+ flex-direction: column;
3416
+ gap: 0.4rem;
3417
+ }
3418
+
3419
+ .form-label {
3420
+ font-size: 0.8rem;
3421
+ font-weight: 600;
3422
+ color: var(--text-secondary);
3423
+ }
3424
+
3425
+ .drawer-text-input {
3426
+ background: var(--bg-card);
3427
+ border: 1px solid var(--border-color);
3428
+ color: var(--text-white);
3429
+ padding: 0.5rem 0.75rem;
3430
+ border-radius: 6px;
3431
+ font-family: 'JetBrains Mono', monospace;
3432
+ font-size: 0.82rem;
3433
+ outline: none;
3434
+ transition: border-color 0.2s ease;
3435
+ }
3436
+
3437
+ .drawer-text-input:focus {
3438
+ border-color: var(--purple-electric);
3439
+ box-shadow: 0 0 8px var(--purple-glow);
3440
+ }
3441
+
3442
+ /* Rate Slider */
3443
+ .slider-header {
3444
+ display: flex;
3445
+ justify-content: space-between;
3446
+ align-items: center;
3447
+ }
3448
+
3449
+ .rate-value-badge {
3450
+ font-family: 'JetBrains Mono', monospace;
3451
+ font-size: 0.78rem;
3452
+ font-weight: 700;
3453
+ color: #00f0ff;
3454
+ background: rgba(0, 240, 255, 0.1);
3455
+ border: 1px solid rgba(0, 240, 255, 0.3);
3456
+ padding: 0.1rem 0.45rem;
3457
+ border-radius: 4px;
3458
+ }
3459
+
3460
+ .drawer-range-slider {
3461
+ width: 100%;
3462
+ accent-color: #8C52FF;
3463
+ cursor: pointer;
3464
+ }
3465
+
3466
+ .slider-ticks {
3467
+ display: flex;
3468
+ justify-content: space-between;
3469
+ font-size: 0.68rem;
3470
+ color: var(--text-muted);
3471
+ font-family: 'JetBrains Mono', monospace;
3472
+ }
3473
+
3474
+ /* Checkboxes */
3475
+ .checkboxes-group {
3476
+ gap: 0.6rem;
3477
+ }
3478
+
3479
+ .drawer-checkbox-label {
3480
+ display: flex;
3481
+ align-items: center;
3482
+ cursor: pointer;
3483
+ font-size: 0.82rem;
3484
+ color: var(--text-secondary);
3485
+ gap: 0.5rem;
3486
+ }
3487
+
3488
+ .drawer-checkbox-label:hover {
3489
+ color: var(--text-white);
3490
+ }
3491
+
3492
+ .drawer-checkbox-label input[type="checkbox"] {
3493
+ display: none;
3494
+ }
3495
+
3496
+ .custom-checkbox {
3497
+ width: 16px;
3498
+ height: 16px;
3499
+ background: var(--bg-card);
3500
+ border: 1.5px solid var(--border-color);
3501
+ border-radius: 4px;
3502
+ position: relative;
3503
+ flex-shrink: 0;
3504
+ transition: all 0.2s ease;
3505
+ }
3506
+
3507
+ .drawer-checkbox-label input[type="checkbox"]:checked + .custom-checkbox {
3508
+ background: var(--purple-electric);
3509
+ border-color: var(--purple-electric);
3510
+ box-shadow: 0 0 6px var(--purple-glow);
3511
+ }
3512
+
3513
+ .drawer-checkbox-label input[type="checkbox"]:checked + .custom-checkbox::after {
3514
+ content: '✓';
3515
+ position: absolute;
3516
+ top: -3px;
3517
+ left: 2px;
3518
+ color: #fff;
3519
+ font-weight: bold;
3520
+ font-size: 11px;
3521
+ }
3522
+
3523
+ /* Scan Live Console */
3524
+ .scan-live-console {
3525
+ background: #090d16;
3526
+ border: 1px solid var(--border-color);
3527
+ border-radius: 6px;
3528
+ padding: 0.65rem;
3529
+ max-height: 14rem;
3530
+ min-height: 9rem;
3531
+ overflow-y: auto;
3532
+ font-family: 'JetBrains Mono', monospace;
3533
+ font-size: 0.72rem;
3534
+ line-height: 1.5;
3535
+ display: flex;
3536
+ flex-direction: column;
3537
+ gap: 0.25rem;
3538
+ }
3539
+
3540
+ .console-line {
3541
+ word-break: break-all;
3542
+ }
3543
+
3544
+ .console-line.info { color: #94a3b8; }
3545
+ .console-line.success { color: #22c55e; }
3546
+ .console-line.warning { color: #f59e0b; }
3547
+ .console-line.error { color: #ef4444; }
3548
+
3549
+ .badge-verified-active {
3550
+ background: rgba(34, 197, 94, 0.18);
3551
+ color: #4ade80;
3552
+ border: 1px solid rgba(34, 197, 94, 0.4);
3553
+ font-size: 0.72rem;
3554
+ font-weight: 700;
3555
+ padding: 0.15rem 0.45rem;
3556
+ border-radius: 4px;
3557
+ display: inline-flex;
3558
+ align-items: center;
3559
+ gap: 0.3rem;
3560
+ margin-left: 0.4rem;
3561
+ }
3562
+
3563
+ .badge-unverified {
3564
+ background: rgba(245, 158, 11, 0.12);
3565
+ color: #fbbf24;
3566
+ border: 1px dashed #f59e0b;
3567
+ font-size: 0.72rem;
3568
+ font-weight: 600;
3569
+ padding: 0.15rem 0.45rem;
3570
+ border-radius: 4px;
3571
+ display: inline-flex;
3572
+ align-items: center;
3573
+ gap: 0.3rem;
3574
+ margin-left: 0.4rem;
3575
+ }
3576
+
3577
+ /* Nuclei Specific UI Elements */
3578
+ .btn-nuclei-action {
3579
+ background: linear-gradient(135deg, #ef4444 0%, #b91c1c 100%);
3580
+ box-shadow: 0 4px 12px rgba(239, 68, 68, 0.35);
3581
+ }
3582
+
3583
+ .btn-nuclei-action:hover {
3584
+ background: linear-gradient(135deg, #f87171 0%, #dc2626 100%);
3585
+ box-shadow: 0 0 18px rgba(239, 68, 68, 0.5);
3586
+ }
3587
+
3588
+ .sev-tag-label {
3589
+ font-weight: 700;
3590
+ font-size: 0.8rem;
3591
+ text-transform: uppercase;
3592
+ letter-spacing: 0.5px;
3593
+ }
3594
+
3595
+ .sev-critical-text { color: #ef4444; }
3596
+ .sev-high-text { color: #f97316; }
3597
+ .sev-medium-text { color: #eab308; }
3598
+ .sev-low-text { color: #3b82f6; }
3599
+ .sev-info-text { color: #94a3b8; }
3600
+
3601
+ .custom-checkbox-red {
3602
+ border-color: rgba(239, 68, 68, 0.4);
3603
+ }
3604
+ .drawer-checkbox-label input[type="checkbox"]:checked + .custom-checkbox-red {
3605
+ background: #ef4444;
3606
+ border-color: #ef4444;
3607
+ box-shadow: 0 0 6px rgba(239, 68, 68, 0.6);
3608
+ }
3609
+
3610
+ .custom-checkbox-orange {
3611
+ border-color: rgba(249, 115, 22, 0.4);
3612
+ }
3613
+ .drawer-checkbox-label input[type="checkbox"]:checked + .custom-checkbox-orange {
3614
+ background: #f97316;
3615
+ border-color: #f97316;
3616
+ box-shadow: 0 0 6px rgba(249, 115, 22, 0.6);
3617
+ }
3618
+
3619
+ .custom-checkbox-yellow {
3620
+ border-color: rgba(234, 179, 8, 0.4);
3621
+ }
3622
+ .drawer-checkbox-label input[type="checkbox"]:checked + .custom-checkbox-yellow {
3623
+ background: #eab308;
3624
+ border-color: #eab308;
3625
+ box-shadow: 0 0 6px rgba(234, 179, 8, 0.6);
3626
+ }
3627
+
3628
+ .custom-checkbox-blue {
3629
+ border-color: rgba(59, 130, 246, 0.4);
3630
+ }
3631
+ .drawer-checkbox-label input[type="checkbox"]:checked + .custom-checkbox-blue {
3632
+ background: #3b82f6;
3633
+ border-color: #3b82f6;
3634
+ box-shadow: 0 0 6px rgba(59, 130, 246, 0.6);
3635
+ }
3636
+
3637
+ .custom-checkbox-slate {
3638
+ border-color: rgba(148, 163, 184, 0.4);
3639
+ }
3640
+ .drawer-checkbox-label input[type="checkbox"]:checked + .custom-checkbox-slate {
3641
+ background: #64748b;
3642
+ border-color: #64748b;
3643
+ box-shadow: 0 0 6px rgba(100, 116, 139, 0.6);
3644
+ }
3645
+
3646
+ /* Nuclei Tag Chips Grid */
3647
+ .nuclei-tags-grid {
3648
+ display: flex;
3649
+ flex-wrap: wrap;
3650
+ gap: 0.45rem;
3651
+ margin-top: 0.35rem;
3652
+ }
3653
+
3654
+ .tag-chip-label {
3655
+ cursor: pointer;
3656
+ }
3657
+
3658
+ .tag-chip-label input[type="checkbox"] {
3659
+ display: none;
3660
+ }
3661
+
3662
+ .tag-chip {
3663
+ display: inline-block;
3664
+ padding: 0.25rem 0.6rem;
3665
+ background: var(--bg-card);
3666
+ border: 1px solid var(--border-color);
3667
+ border-radius: 6px;
3668
+ font-family: 'JetBrains Mono', monospace;
3669
+ font-size: 0.76rem;
3670
+ color: var(--text-secondary);
3671
+ transition: all 0.2s ease;
3672
+ }
3673
+
3674
+ .tag-chip:hover {
3675
+ border-color: rgba(140, 82, 255, 0.5);
3676
+ color: var(--text-white);
3677
+ }
3678
+
3679
+ .tag-chip-label input[type="checkbox"]:checked + .tag-chip {
3680
+ background: rgba(140, 82, 255, 0.18);
3681
+ border-color: var(--purple-electric);
3682
+ color: #00f0ff;
3683
+ box-shadow: 0 0 8px var(--purple-glow);
3684
+ font-weight: 600;
3685
+ }
3686
+
3687
+ .nuclei-perf-grid {
3688
+ display: grid;
3689
+ grid-template-columns: 1fr 1fr;
3690
+ gap: 0.75rem;
3691
+ }
3692
+
3693
+ .input-hint {
3694
+ font-size: 0.7rem;
3695
+ color: var(--text-muted);
3696
+ margin-top: 0.15rem;
3697
+ }
3698
+
3699
+ /* Full height logs console */
3700
+ .logs-header-row {
3701
+ display: flex;
3702
+ justify-content: space-between;
3703
+ align-items: center;
3704
+ }
3705
+
3706
+ .logs-title-left {
3707
+ display: flex;
3708
+ align-items: center;
3709
+ gap: 0.5rem;
3710
+ }
3711
+
3712
+ .btn-clear-logs {
3713
+ background: transparent;
3714
+ border: 1px solid var(--border-color);
3715
+ color: var(--text-muted);
3716
+ font-size: 0.72rem;
3717
+ padding: 0.15rem 0.45rem;
3718
+ border-radius: 4px;
3719
+ cursor: pointer;
3720
+ display: inline-flex;
3721
+ align-items: center;
3722
+ gap: 0.25rem;
3723
+ transition: all 0.2s ease;
3724
+ }
3725
+
3726
+ .btn-clear-logs:hover {
3727
+ background: rgba(239, 68, 68, 0.15);
3728
+ border-color: rgba(239, 68, 68, 0.4);
3729
+ color: #ef4444;
3730
+ }
3731
+
3732
+ .btn-clear-logs .ui-icon {
3733
+ width: 12px;
3734
+ height: 12px;
3735
+ }
3736
+
3737
+ .full-height-console {
3738
+ max-height: 28rem;
3739
+ min-height: 18rem;
3740
+ }
3741
+
3742
+ /* Individual target scan buttons */
3743
+ .target-actions-btns {
3744
+ display: flex;
3745
+ align-items: center;
3746
+ gap: 0.35rem;
3747
+ }
3748
+
3749
+ .btn-target-scan-mini {
3750
+ background: var(--bg-card);
3751
+ border: 1px solid var(--border-color);
3752
+ color: var(--text-secondary);
3753
+ border-radius: 5px;
3754
+ padding: 0.25rem 0.5rem;
3755
+ font-size: 0.72rem;
3756
+ font-weight: 600;
3757
+ cursor: pointer;
3758
+ display: inline-flex;
3759
+ align-items: center;
3760
+ gap: 0.25rem;
3761
+ transition: all 0.2s ease;
3762
+ }
3763
+
3764
+ .btn-target-scan-mini.port-scan:hover {
3765
+ background: rgba(140, 82, 255, 0.2);
3766
+ border-color: var(--purple-electric);
3767
+ color: #fff;
3768
+ }
3769
+
3770
+ .btn-target-scan-mini.nuclei-scan {
3771
+ color: #f87171;
3772
+ border-color: rgba(239, 68, 68, 0.3);
3773
+ }
3774
+
3775
+ .btn-target-scan-mini.nuclei-scan:hover {
3776
+ background: rgba(239, 68, 68, 0.2);
3777
+ border-color: #ef4444;
3778
+ color: #fff;
3779
+ }
3780
+
3781
+ .btn-target-scan-mini:disabled {
3782
+ opacity: 0.4;
3783
+ cursor: not-allowed;
3784
+ }
3785
+
3786
+ .btn-target-remove-mini {
3787
+ background: transparent;
3788
+ border: none;
3789
+ color: var(--text-muted);
3790
+ cursor: pointer;
3791
+ padding: 0.25rem;
3792
+ border-radius: 4px;
3793
+ display: inline-flex;
3794
+ align-items: center;
3795
+ transition: all 0.2s ease;
3796
+ }
3797
+
3798
+ .btn-target-remove-mini:hover {
3799
+ color: #ef4444;
3800
+ background: rgba(239, 68, 68, 0.1);
3801
+ }
3802
+