larxius commited on
Commit
e4b94b3
·
verified ·
1 Parent(s): 25de298

Update frontend/src/pages/LogsAndThreats.jsx

Browse files
Files changed (1) hide show
  1. frontend/src/pages/LogsAndThreats.jsx +51 -51
frontend/src/pages/LogsAndThreats.jsx CHANGED
@@ -498,124 +498,124 @@ const LogsAndThreats = () => {
498
  const activeSev = severityColorMap[sevKey] || severityColorMap.medium;
499
 
500
  return (
501
- <div className="fixed inset-0 bg-slate-950/80 backdrop-blur-md flex items-center justify-center p-3 sm:p-4 z-[9999] animate-fade-in">
502
- <div className={`bg-surface border border-outline-variant/80 rounded-2xl max-w-2xl w-full shadow-2xl relative my-auto overflow-hidden flex flex-col transition-all duration-200 transform animate-in fade-in zoom-in-95 border-t-4 ${activeSev.border}`}>
503
 
504
  {/* Header Banner */}
505
- <div className="bg-surface-container-low p-4 sm:p-5 border-b border-outline-variant/70 relative">
506
  <button
507
  onClick={() => setSelectedThreat(null)}
508
- className="absolute top-4 right-4 text-on-surface-variant hover:text-on-surface bg-surface-container-high p-1.5 rounded-full transition-all cursor-pointer border border-outline-variant/60 hover:scale-105"
509
  title="Close"
510
  >
511
  <X className="w-4 h-4" />
512
  </button>
513
 
514
- <div className="flex items-center gap-2 flex-wrap mb-2 pr-10">
515
- <span className={`px-2.5 py-0.5 rounded-md text-[10px] font-black uppercase tracking-wider border flex items-center gap-1 ${getSeverityBadgeClass(selectedThreat.severity)}`}>
516
  <ShieldAlert className="w-3 h-3" />
517
  {selectedThreat.severity}
518
  </span>
519
- <span className="bg-cyan-500/10 text-cyan-600 dark:text-cyan-400 text-[10px] font-black px-2.5 py-0.5 rounded-md border border-cyan-500/30 font-mono">
520
  CVSS {selectedThreat.cvss}
521
  </span>
522
- <span className="bg-red-500/10 text-red-600 dark:text-red-400 text-[10px] font-black px-2.5 py-0.5 rounded-md border border-red-500/30 flex items-center gap-1">
523
  <span className="w-1.5 h-1.5 rounded-full bg-red-500 animate-pulse"></span>
524
  {selectedThreat.count} Detections
525
  </span>
526
  </div>
527
 
528
- <h2 className="text-[18px] sm:text-[20px] font-bold text-on-surface tracking-tight leading-snug font-display">
529
  {selectedThreat.title}
530
  </h2>
531
  </div>
532
 
533
- {/* Modal Body: Compact Executive 2-Column Layout (No Scroll Required) */}
534
- <div className="p-4 sm:p-5 space-y-3.5 text-[12.5px] bg-surface">
535
 
536
- {/* Top Row: Category & OWASP Compact Badges */}
537
- <div className="grid grid-cols-2 gap-3">
538
- <div className="bg-surface-container-lowest p-2.5 px-3 rounded-xl border border-outline-variant/60 flex items-center gap-2.5">
539
- <Layers className="w-4 h-4 text-primary shrink-0" />
540
  <div className="truncate">
541
- <span className="text-[10px] font-bold text-on-surface-variant uppercase tracking-wider block leading-none mb-0.5">Category</span>
542
- <span className="font-bold text-on-surface text-[12.5px] truncate block">{selectedThreat.category}</span>
543
  </div>
544
  </div>
545
 
546
- <div className="bg-surface-container-lowest p-2.5 px-3 rounded-xl border border-outline-variant/60 flex items-center gap-2.5">
547
- <Shield className="w-4 h-4 text-indigo-500 shrink-0" />
548
  <div className="truncate">
549
- <span className="text-[10px] font-bold text-on-surface-variant uppercase tracking-wider block leading-none mb-0.5">OWASP Standard</span>
550
- <span className="font-bold text-indigo-500 text-[12.5px] truncate block">{selectedThreat.owasp}</span>
551
  </div>
552
  </div>
553
  </div>
554
 
555
- {/* Middle Grid: Overview & Impact */}
556
- <div className="grid grid-cols-1 sm:grid-cols-2 gap-3">
557
- <div className="bg-surface-container-lowest p-3 rounded-xl border-l-3 border-l-primary border border-outline-variant/60">
558
- <h3 className="font-bold text-on-surface text-[12px] mb-1 flex items-center gap-1.5">
559
- <Shield className="w-3.5 h-3.5 text-primary" /> Threat Overview
560
  </h3>
561
- <p className="text-on-surface-variant leading-relaxed text-[12px] line-clamp-4">
562
  {selectedThreat.description}
563
  </p>
564
  </div>
565
 
566
- <div className="bg-surface-container-lowest p-3 rounded-xl border-l-3 border-l-amber-500 border border-outline-variant/60">
567
- <h3 className="font-bold text-amber-600 dark:text-amber-400 text-[12px] mb-1 flex items-center gap-1.5">
568
- <AlertTriangle className="w-3.5 h-3.5" /> Exploitation & Impact Risk
569
  </h3>
570
- <p className="text-on-surface-variant leading-relaxed text-[12px] line-clamp-4">
571
  {selectedThreat.impact}
572
  </p>
573
  </div>
574
  </div>
575
 
576
- {/* Code Remediation Terminal Box */}
577
- <div className="bg-surface-container-lowest rounded-xl border border-outline-variant/60 overflow-hidden">
578
- <div className="bg-surface-container-high/60 px-3 py-1.5 border-b border-outline-variant/60 flex items-center justify-between">
579
- <h3 className="font-bold text-on-surface text-[11.5px] flex items-center gap-1.5 font-mono">
580
- <Terminal className="w-3.5 h-3.5 text-green-500" /> Recommended Remediation
581
  </h3>
582
 
583
  <button
584
  onClick={() => copyToClipboard(selectedThreat.remediation)}
585
- className="flex items-center gap-1 px-2 py-0.5 bg-surface-container hover:bg-surface-container-highest text-on-surface rounded text-[11px] font-bold border border-outline-variant/70 cursor-pointer transition-all active:scale-95"
586
  >
587
  {copiedCode ? <Check className="w-3 h-3 text-green-500" /> : <Copy className="w-3 h-3 text-primary" />}
588
  {copiedCode ? 'Copied' : 'Copy'}
589
  </button>
590
  </div>
591
 
592
- <div className="bg-[#090d16] text-[#38bdf8] font-mono text-[11.5px] p-2.5 leading-snug overflow-x-auto whitespace-pre-wrap max-h-24">
593
  {selectedThreat.remediation}
594
  </div>
595
  </div>
596
 
597
- {/* Affected Target Endpoints */}
598
  {selectedThreat.affected_targets && selectedThreat.affected_targets.length > 0 && (
599
- <div className="bg-surface-container-lowest p-2.5 rounded-xl border border-outline-variant/60">
600
- <h3 className="font-bold text-on-surface text-[11.5px] mb-1.5 flex items-center gap-1.5">
601
- <ExternalLink className="w-3.5 h-3.5 text-primary" /> Affected Targets ({selectedThreat.affected_targets.length})
602
  </h3>
603
- <div className="flex flex-wrap gap-1.5">
604
- {selectedThreat.affected_targets.slice(0, 3).map((url, idx) => (
605
  <a
606
  key={idx}
607
  href={url}
608
  target="_blank"
609
  rel="noopener noreferrer"
610
- className="bg-surface-container border border-outline-variant/70 hover:border-primary/50 text-on-surface font-mono text-[11px] px-2 py-0.5 rounded-md flex items-center gap-1 transition-all"
611
  >
612
  <span className="w-1.5 h-1.5 rounded-full bg-red-500"></span>
613
  {url}
614
  </a>
615
  ))}
616
- {selectedThreat.affected_targets.length > 3 && (
617
- <span className="bg-surface-container text-on-surface-variant font-mono text-[11px] px-2 py-0.5 rounded-md font-bold">
618
- +{selectedThreat.affected_targets.length - 3} more
619
  </span>
620
  )}
621
  </div>
@@ -624,14 +624,14 @@ const LogsAndThreats = () => {
624
  </div>
625
 
626
  {/* Compact Actions Footer */}
627
- <div className="p-3 px-4 bg-surface-container-lowest border-t border-outline-variant/70 flex items-center justify-between flex-wrap gap-2">
628
  <button
629
  onClick={() => {
630
  const query = selectedThreat.title;
631
  setSelectedThreat(null);
632
  openFullLogsView(query);
633
  }}
634
- className="px-3.5 py-2 bg-primary/10 hover:bg-primary/20 text-primary border border-primary/30 rounded-lg font-bold text-[12px] flex items-center gap-1.5 cursor-pointer transition-all active:scale-95"
635
  >
636
  <Search className="w-3.5 h-3.5" />
637
  Filter Audit Logs for this Threat
@@ -639,7 +639,7 @@ const LogsAndThreats = () => {
639
 
640
  <button
641
  onClick={() => setSelectedThreat(null)}
642
- className="px-5 py-2 bg-primary text-white hover:brightness-110 rounded-lg font-bold text-[12px] cursor-pointer border-0 shadow-md shadow-primary/20 transition-all active:scale-95"
643
  >
644
  Close
645
  </button>
 
498
  const activeSev = severityColorMap[sevKey] || severityColorMap.medium;
499
 
500
  return (
501
+ <div className="fixed inset-0 bg-slate-950/80 backdrop-blur-md flex items-center justify-center p-3 z-[9999] animate-fade-in overflow-hidden">
502
+ <div className={`bg-surface border border-outline-variant/80 rounded-2xl max-w-xl w-full shadow-2xl relative overflow-hidden flex flex-col transition-all duration-200 transform animate-in fade-in zoom-in-95 border-t-4 ${activeSev.border}`}>
503
 
504
  {/* Header Banner */}
505
+ <div className="bg-surface-container-low p-3.5 px-4 border-b border-outline-variant/70 relative">
506
  <button
507
  onClick={() => setSelectedThreat(null)}
508
+ className="absolute top-3 right-3 text-on-surface-variant hover:text-on-surface bg-surface-container-high p-1 rounded-full transition-all cursor-pointer border border-outline-variant/60 hover:scale-105"
509
  title="Close"
510
  >
511
  <X className="w-4 h-4" />
512
  </button>
513
 
514
+ <div className="flex items-center gap-2 flex-wrap mb-1.5 pr-8">
515
+ <span className={`px-2 py-0.5 rounded text-[10px] font-black uppercase tracking-wider border flex items-center gap-1 ${getSeverityBadgeClass(selectedThreat.severity)}`}>
516
  <ShieldAlert className="w-3 h-3" />
517
  {selectedThreat.severity}
518
  </span>
519
+ <span className="bg-cyan-500/10 text-cyan-600 dark:text-cyan-400 text-[10px] font-black px-2 py-0.5 rounded border border-cyan-500/30 font-mono">
520
  CVSS {selectedThreat.cvss}
521
  </span>
522
+ <span className="bg-red-500/10 text-red-600 dark:text-red-400 text-[10px] font-black px-2 py-0.5 rounded border border-red-500/30 flex items-center gap-1">
523
  <span className="w-1.5 h-1.5 rounded-full bg-red-500 animate-pulse"></span>
524
  {selectedThreat.count} Detections
525
  </span>
526
  </div>
527
 
528
+ <h2 className="text-[17px] font-bold text-on-surface tracking-tight leading-snug font-display">
529
  {selectedThreat.title}
530
  </h2>
531
  </div>
532
 
533
+ {/* Modal Body: Completely Scroll-Free Compact Layout */}
534
+ <div className="p-3.5 px-4 space-y-2.5 text-[12px] bg-surface overflow-hidden">
535
 
536
+ {/* Top Row: Category & OWASP */}
537
+ <div className="grid grid-cols-2 gap-2.5">
538
+ <div className="bg-surface-container-lowest p-2 px-2.5 rounded-lg border border-outline-variant/60 flex items-center gap-2">
539
+ <Layers className="w-3.5 h-3.5 text-primary shrink-0" />
540
  <div className="truncate">
541
+ <span className="text-[9.5px] font-bold text-on-surface-variant uppercase tracking-wider block leading-none mb-0.5">Category</span>
542
+ <span className="font-bold text-on-surface text-[11.5px] truncate block">{selectedThreat.category}</span>
543
  </div>
544
  </div>
545
 
546
+ <div className="bg-surface-container-lowest p-2 px-2.5 rounded-lg border border-outline-variant/60 flex items-center gap-2">
547
+ <Shield className="w-3.5 h-3.5 text-indigo-500 shrink-0" />
548
  <div className="truncate">
549
+ <span className="text-[9.5px] font-bold text-on-surface-variant uppercase tracking-wider block leading-none mb-0.5">OWASP Standard</span>
550
+ <span className="font-bold text-indigo-500 text-[11.5px] truncate block">{selectedThreat.owasp}</span>
551
  </div>
552
  </div>
553
  </div>
554
 
555
+ {/* Middle Grid: Overview & Impact (Compact line-clamp) */}
556
+ <div className="grid grid-cols-1 sm:grid-cols-2 gap-2.5">
557
+ <div className="bg-surface-container-lowest p-2.5 rounded-lg border-l-2 border-l-primary border border-outline-variant/60">
558
+ <h3 className="font-bold text-on-surface text-[11.5px] mb-1 flex items-center gap-1">
559
+ <Shield className="w-3 h-3 text-primary" /> Threat Overview
560
  </h3>
561
+ <p className="text-on-surface-variant leading-snug text-[11.5px] line-clamp-3">
562
  {selectedThreat.description}
563
  </p>
564
  </div>
565
 
566
+ <div className="bg-surface-container-lowest p-2.5 rounded-lg border-l-2 border-l-amber-500 border border-outline-variant/60">
567
+ <h3 className="font-bold text-amber-600 dark:text-amber-400 text-[11.5px] mb-1 flex items-center gap-1">
568
+ <AlertTriangle className="w-3 h-3" /> Exploitation Risk
569
  </h3>
570
+ <p className="text-on-surface-variant leading-snug text-[11.5px] line-clamp-3">
571
  {selectedThreat.impact}
572
  </p>
573
  </div>
574
  </div>
575
 
576
+ {/* Code Remediation Box */}
577
+ <div className="bg-surface-container-lowest rounded-lg border border-outline-variant/60 overflow-hidden">
578
+ <div className="bg-surface-container-high/60 px-2.5 py-1 border-b border-outline-variant/60 flex items-center justify-between">
579
+ <h3 className="font-bold text-on-surface text-[11px] flex items-center gap-1 font-mono">
580
+ <Terminal className="w-3 h-3 text-green-500" /> Recommended Fix
581
  </h3>
582
 
583
  <button
584
  onClick={() => copyToClipboard(selectedThreat.remediation)}
585
+ className="flex items-center gap-1 px-1.5 py-0.5 bg-surface-container hover:bg-surface-container-highest text-on-surface rounded text-[10.5px] font-bold border border-outline-variant/70 cursor-pointer transition-all active:scale-95"
586
  >
587
  {copiedCode ? <Check className="w-3 h-3 text-green-500" /> : <Copy className="w-3 h-3 text-primary" />}
588
  {copiedCode ? 'Copied' : 'Copy'}
589
  </button>
590
  </div>
591
 
592
+ <div className="bg-[#090d16] text-[#38bdf8] font-mono text-[11px] p-2 leading-tight whitespace-pre-wrap max-h-16 overflow-hidden">
593
  {selectedThreat.remediation}
594
  </div>
595
  </div>
596
 
597
+ {/* Affected Endpoints */}
598
  {selectedThreat.affected_targets && selectedThreat.affected_targets.length > 0 && (
599
+ <div className="bg-surface-container-lowest p-2 rounded-lg border border-outline-variant/60">
600
+ <h3 className="font-bold text-on-surface text-[11px] mb-1 flex items-center gap-1">
601
+ <ExternalLink className="w-3 h-3 text-primary" /> Affected Targets ({selectedThreat.affected_targets.length})
602
  </h3>
603
+ <div className="flex flex-wrap gap-1">
604
+ {selectedThreat.affected_targets.slice(0, 2).map((url, idx) => (
605
  <a
606
  key={idx}
607
  href={url}
608
  target="_blank"
609
  rel="noopener noreferrer"
610
+ className="bg-surface-container border border-outline-variant/70 text-on-surface font-mono text-[10.5px] px-2 py-0.5 rounded flex items-center gap-1"
611
  >
612
  <span className="w-1.5 h-1.5 rounded-full bg-red-500"></span>
613
  {url}
614
  </a>
615
  ))}
616
+ {selectedThreat.affected_targets.length > 2 && (
617
+ <span className="bg-surface-container text-on-surface-variant font-mono text-[10.5px] px-1.5 py-0.5 rounded font-bold">
618
+ +{selectedThreat.affected_targets.length - 2} more
619
  </span>
620
  )}
621
  </div>
 
624
  </div>
625
 
626
  {/* Compact Actions Footer */}
627
+ <div className="p-2.5 px-4 bg-surface-container-lowest border-t border-outline-variant/70 flex items-center justify-between flex-wrap gap-2">
628
  <button
629
  onClick={() => {
630
  const query = selectedThreat.title;
631
  setSelectedThreat(null);
632
  openFullLogsView(query);
633
  }}
634
+ className="px-3 py-1.5 bg-primary/10 hover:bg-primary/20 text-primary border border-primary/30 rounded-lg font-bold text-[11.5px] flex items-center gap-1 cursor-pointer transition-all active:scale-95"
635
  >
636
  <Search className="w-3.5 h-3.5" />
637
  Filter Audit Logs for this Threat
 
639
 
640
  <button
641
  onClick={() => setSelectedThreat(null)}
642
+ className="px-4 py-1.5 bg-primary text-white hover:brightness-110 rounded-lg font-bold text-[11.5px] cursor-pointer border-0 shadow-sm shadow-primary/20 transition-all active:scale-95"
643
  >
644
  Close
645
  </button>