matthewspring commited on
Commit
4454be0
·
verified ·
1 Parent(s): 48a2b2f

Upload folder using huggingface_hub

Browse files
Files changed (1) hide show
  1. index.html +461 -391
index.html CHANGED
@@ -5,8 +5,8 @@
5
  <meta charset="UTF-8">
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
8
- <meta name="description" content="Hardened Gemma 3 LLM Container Security Dashboard">
9
- <title>Gemma 3 Hardened Container Dashboard</title>
10
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
11
  <style>
12
  :root {
@@ -20,6 +20,8 @@
20
  --info: #17a2b8;
21
  --light: #f8f9fa;
22
  --dark: #0a0a0f;
 
 
23
  --shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
24
  --radius: 12px;
25
  --transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
@@ -58,7 +60,7 @@
58
  display: flex;
59
  justify-content: space-between;
60
  align-items: center;
61
- max-width: 1600px;
62
  margin: 0 auto;
63
  width: 100%;
64
  }
@@ -67,6 +69,7 @@
67
  display: flex;
68
  align-items: center;
69
  gap: 1rem;
 
70
  }
71
 
72
  .logo {
@@ -99,6 +102,18 @@
99
  color: var(--highlight);
100
  }
101
 
 
 
 
 
 
 
 
 
 
 
 
 
102
  .built-with {
103
  font-size: 0.85rem;
104
  opacity: 0.9;
@@ -129,6 +144,7 @@
129
  display: flex;
130
  list-style: none;
131
  gap: 0.5rem;
 
132
  }
133
 
134
  nav a {
@@ -169,7 +185,7 @@
169
  /* Main Content */
170
  main {
171
  flex: 1;
172
- max-width: 1600px;
173
  margin: 2rem auto;
174
  padding: 0 1.5rem;
175
  width: 100%;
@@ -189,6 +205,87 @@
189
  color: var(--highlight);
190
  }
191
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
192
  /* Dashboard Grid */
193
  .dashboard-grid {
194
  display: grid;
@@ -228,6 +325,40 @@
228
  background: linear-gradient(90deg, var(--highlight), var(--success));
229
  }
230
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
231
  .card-icon {
232
  width: 48px;
233
  height: 48px;
@@ -242,6 +373,22 @@
242
  box-shadow: 0 4px 15px rgba(233, 69, 96, 0.3);
243
  }
244
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
245
  .card-title {
246
  font-size: 1.15rem;
247
  margin-bottom: 0.6rem;
@@ -292,6 +439,148 @@
292
  font-weight: 500;
293
  }
294
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
295
  /* Security Controls Section */
296
  .security-section {
297
  background: linear-gradient(135deg, rgba(26, 26, 46, 0.95) 0%, rgba(22, 33, 62, 0.95) 100%);
@@ -367,6 +656,16 @@
367
  background: rgba(255, 255, 255, 0.2);
368
  }
369
 
 
 
 
 
 
 
 
 
 
 
370
  /* Security Item */
371
  .security-item {
372
  margin-bottom: 1rem;
@@ -390,6 +689,14 @@
390
  border-left-color: var(--danger);
391
  }
392
 
 
 
 
 
 
 
 
 
393
  .security-header {
394
  display: flex;
395
  justify-content: space-between;
@@ -477,10 +784,85 @@
477
  color: #4ec9b0;
478
  }
479
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
480
  /* System Health Section */
481
  .health-section {
482
  display: grid;
483
- grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
484
  gap: 1rem;
485
  margin-bottom: 2rem;
486
  }
@@ -563,6 +945,7 @@
563
  display: flex;
564
  background: rgba(0, 0, 0, 0.3);
565
  border-bottom: 1px solid rgba(255, 255, 255, 0.1);
 
566
  }
567
 
568
  .script-tab {
@@ -574,6 +957,7 @@
574
  transition: var(--transition);
575
  font-size: 0.85rem;
576
  border-bottom: 2px solid transparent;
 
577
  }
578
 
579
  .script-tab:hover {
@@ -589,7 +973,7 @@
589
 
590
  .script-content {
591
  padding: 1rem;
592
- max-height: 500px;
593
  overflow-y: auto;
594
  }
595
 
@@ -635,6 +1019,12 @@
635
  color: var(--info);
636
  }
637
 
 
 
 
 
 
 
638
  .alert i {
639
  font-size: 1.2rem;
640
  margin-top: 0.1rem;
@@ -654,6 +1044,69 @@
654
  opacity: 0.9;
655
  }
656
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
657
  /* Modal */
658
  .modal {
659
  position: fixed;
@@ -682,7 +1135,7 @@
682
  border-radius: var(--radius);
683
  padding: 1.5rem;
684
  width: 90%;
685
- max-width: 900px;
686
  max-height: 90vh;
687
  overflow-y: auto;
688
  box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5);
@@ -757,387 +1210,4 @@
757
  .modal-footer {
758
  display: flex;
759
  justify-content: flex-end;
760
- gap: 1rem;
761
- }
762
-
763
- /* Footer */
764
- footer {
765
- background: linear-gradient(135deg, var(--dark) 0%, var(--primary) 100%);
766
- color: white;
767
- text-align: center;
768
- padding: 1.5rem;
769
- margin-top: auto;
770
- border-top: 1px solid rgba(255, 255, 255, 0.1);
771
- }
772
-
773
- .footer-content {
774
- max-width: 1600px;
775
- margin: 0 auto;
776
- }
777
-
778
- .footer-links {
779
- display: flex;
780
- justify-content: center;
781
- gap: 1.5rem;
782
- margin-bottom: 1rem;
783
- flex-wrap: wrap;
784
- }
785
-
786
- .footer-links a {
787
- color: rgba(255, 255, 255, 0.7);
788
- text-decoration: none;
789
- padding: 0.4rem 0.8rem;
790
- border-radius: 6px;
791
- transition: var(--transition);
792
- font-size: 0.85rem;
793
- }
794
-
795
- .footer-links a:hover {
796
- color: var(--highlight);
797
- background: rgba(255, 255, 255, 0.05);
798
- }
799
-
800
- .copyright {
801
- opacity: 0.6;
802
- font-size: 0.8rem;
803
- }
804
-
805
- /* Responsive Design */
806
- @media (max-width: 1024px) {
807
- .header-content {
808
- flex-direction: column;
809
- gap: 1rem;
810
- }
811
-
812
- nav ul {
813
- flex-wrap: wrap;
814
- justify-content: center;
815
- }
816
-
817
- .security-content {
818
- grid-template-columns: 1fr;
819
- }
820
-
821
- .security-actions {
822
- align-items: flex-start;
823
- flex-direction: row;
824
- }
825
- }
826
-
827
- @media (max-width: 768px) {
828
- .dashboard-grid {
829
- grid-template-columns: 1fr;
830
- }
831
-
832
- .health-section {
833
- grid-template-columns: 1fr 1fr;
834
- }
835
-
836
- header {
837
- padding: 1rem;
838
- }
839
-
840
- main {
841
- padding: 0 1rem;
842
- }
843
-
844
- .script-content pre {
845
- font-size: 0.65rem;
846
- }
847
- }
848
-
849
- @media (max-width: 480px) {
850
- .health-section {
851
- grid-template-columns: 1fr;
852
- }
853
-
854
- .logo {
855
- font-size: 1.3rem;
856
- }
857
-
858
- nav a {
859
- padding: 0.4rem 0.6rem;
860
- font-size: 0.8rem;
861
- }
862
-
863
- .section-title-main {
864
- font-size: 1.4rem;
865
- }
866
- }
867
-
868
- /* Animations */
869
- @keyframes fadeIn {
870
- from {
871
- opacity: 0;
872
- transform: translateY(20px);
873
- }
874
- to {
875
- opacity: 1;
876
- transform: translateY(0);
877
- }
878
- }
879
-
880
- .fade-in {
881
- animation: fadeIn 0.5s ease-out forwards;
882
- }
883
-
884
- /* Scrollbar */
885
- ::-webkit-scrollbar {
886
- width: 8px;
887
- height: 8px;
888
- }
889
-
890
- ::-webkit-scrollbar-track {
891
- background: rgba(0, 0, 0, 0.2);
892
- }
893
-
894
- ::-webkit-scrollbar-thumb {
895
- background: var(--highlight);
896
- border-radius: 4px;
897
- }
898
-
899
- ::-webkit-scrollbar-thumb:hover {
900
- background: #ff6b6b;
901
- }
902
-
903
- /* Notification */
904
- .notification {
905
- position: fixed;
906
- top: 100px;
907
- right: 20px;
908
- padding: 1rem 1.5rem;
909
- border-radius: 8px;
910
- background: var(--secondary);
911
- color: var(--light);
912
- box-shadow: var(--shadow);
913
- transform: translateX(150%);
914
- transition: var(--transition);
915
- z-index: 3000;
916
- display: flex;
917
- align-items: center;
918
- gap: 0.8rem;
919
- border: 1px solid rgba(255, 255, 255, 0.1);
920
- }
921
-
922
- .notification.show {
923
- transform: translateX(0);
924
- }
925
-
926
- .notification.success {
927
- border-left: 4px solid var(--success);
928
- }
929
-
930
- .notification.warning {
931
- border-left: 4px solid var(--warning);
932
- }
933
-
934
- .notification.error {
935
- border-left: 4px solid var(--danger);
936
- }
937
-
938
- .notification.info {
939
- border-left: 4px solid var(--info);
940
- }
941
- </style>
942
- </head>
943
-
944
- <body>
945
- <header>
946
- <div class="header-content">
947
- <div class="logo-container">
948
- <a href="#" class="logo">
949
- <div class="logo-icon">
950
- <i class="fas fa-shield-alt"></i>
951
- </div>
952
- <span>Gemma 3 Hardened</span>
953
- </a>
954
- <span class="model-badge">gemma-3-12b-it-abliterated-v2.q4_k_m.gguf</span>
955
- <div class="built-with">
956
- <i class="fas fa-code"></i>
957
- Built with <a href="https://huggingface.co/spaces/akhaliq/anycoder" target="_blank">anycoder</a>
958
- </div>
959
- </div>
960
- <nav>
961
- <ul>
962
- <li><a href="#dashboard"><i class="fas fa-tachometer-alt"></i> Dashboard</a></li>
963
- <li><a href="#security-controls"><i class="fas fa-lock"></i> Security</a></li>
964
- <li><a href="#deployment-script"><i class="fas fa-terminal"></i> Script</a></li>
965
- <li><a href="#system-health"><i class="fas fa-heartbeat"></i> Health</a></li>
966
- </ul>
967
- </nav>
968
- </div>
969
- </header>
970
-
971
- <main>
972
- <!-- Alerts Section -->
973
- <section id="alerts" class="fade-in">
974
- <div class="alert alert-success">
975
- <i class="fas fa-check-circle"></i>
976
- <div class="alert-content">
977
- <div class="alert-title">Security Improvements Applied</div>
978
- <div class="alert-text">All three security concerns have been addressed: Enhanced entropy handling, dual MAC/Seccomp hardening, and persistent forensic logging.</div>
979
- </div>
980
- </div>
981
- </section>
982
-
983
- <!-- Dashboard Section -->
984
- <section id="dashboard" class="fade-in">
985
- <h1 class="section-title-main"><i class="fas fa-shield-alt"></i> Security Overview - Gemma 3 Model</h1>
986
- <div class="dashboard-grid">
987
- <!-- Entropy Card -->
988
- <div class="card">
989
- <div class="card-icon">
990
- <i class="fas fa-random"></i>
991
- </div>
992
- <h3 class="card-title">Entropy Management</h3>
993
- <p class="card-description">Hardware entropy mirroring via /dev/random bind mount from host. rngd sidecar container ensures continuous entropy pool replenishment for cryptographic operations.</p>
994
- <div class="card-status">
995
- <div class="status-indicator"></div>
996
- <span class="status-text">Healthy (>3000 bits)</span>
997
- </div>
998
- </div>
999
-
1000
- <!-- Dual MAC/Seccomp Card -->
1001
- <div class="card">
1002
- <div class="card-icon">
1003
- <i class="fas fa-layer-group"></i>
1004
- </div>
1005
- <h3 class="card-title">Dual Security Layers</h3>
1006
- <p class="card-description">Combined AppArmor profile (usr.bin.gemma) AND Seccomp filter (45 syscalls allowlist) for maximum defense-in-depth protection.</p>
1007
- <div class="card-status">
1008
- <div class="status-indicator"></div>
1009
- <span class="status-text">Both Active</span>
1010
- </div>
1011
- </div>
1012
-
1013
- <!-- Forensic Logging Card -->
1014
- <div class="card">
1015
- <div class="card-icon">
1016
- <i class="fas fa-file-alt"></i>
1017
- </div>
1018
- <h3 class="card-title">Forensic Logging</h3>
1019
- <p class="card-description">Persistent log storage via host-mounted /var/log directory. Logs survive container restarts and are available for forensic analysis.</p>
1020
- <div class="card-status">
1021
- <div class="status-indicator"></div>
1022
- <span class="status-text">Persistent</span>
1023
- </div>
1024
- </div>
1025
-
1026
- <!-- Network Isolation Card -->
1027
- <div class="card">
1028
- <div class="card-icon">
1029
- <i class="fas fa-network-wired"></i>
1030
- </div>
1031
- <h3 class="card-title">Network Isolation</h3>
1032
- <p class="card-description">Strict network blockade with allowlisted single API port on loopback interface only. All external connections blocked by default.</p>
1033
- <div class="card-status">
1034
- <div class="status-indicator"></div>
1035
- <span class="status-text">Active</span>
1036
- </div>
1037
- </div>
1038
-
1039
- <!-- Non-Root Execution Card -->
1040
- <div class="card">
1041
- <div class="card-icon">
1042
- <i class="fas fa-user-shield"></i>
1043
- </div>
1044
- <h3 class="card-title">Non-Root Execution</h3>
1045
- <p class="card-description">Application runs as dedicated unprivileged user (llm_agent) with minimal capabilities. No root access or privilege escalation possible.</p>
1046
- <div class="card-status">
1047
- <div class="status-indicator"></div>
1048
- <span class="status-text">Secure</span>
1049
- </div>
1050
- </div>
1051
-
1052
- <!-- Read-Only Filesystem Card -->
1053
- <div class="card">
1054
- <div class="card-icon">
1055
- <i class="fas fa-hdd"></i>
1056
- </div>
1057
- <h3 class="card-title">Read-Only Filesystem</h3>
1058
- <p class="card-description">Complete read-only root filesystem with tmpfs mounts for temporary files. Prevents persistent modifications to system files.</p>
1059
- <div class="card-status">
1060
- <div class="status-indicator"></div>
1061
- <span class="status-text">Protected</span>
1062
- </div>
1063
- </div>
1064
- </div>
1065
- </section>
1066
-
1067
- <!-- Security Controls Section -->
1068
- <section id="security-controls" class="security-section fade-in">
1069
- <div class="section-header">
1070
- <h2 class="section-title"><i class="fas fa-cogs"></i> Security Controls</h2>
1071
- <div class="section-actions">
1072
- <button class="btn btn-secondary" id="refresh-btn">
1073
- <i class="fas fa-sync-alt"></i> Refresh
1074
- </button>
1075
- <button class="btn btn-primary" id="run-audit">
1076
- <i class="fas fa-search"></i> Run Audit
1077
- </button>
1078
- </div>
1079
- </div>
1080
-
1081
- <!-- Entropy Security Item -->
1082
- <div class="security-item">
1083
- <div class="security-header">
1084
- <h3 class="security-title"><i class="fas fa-random"></i> Entropy Source (FIXED)</h3>
1085
- <div class="security-status">
1086
- <div class="status-indicator"></div>
1087
- <span>Healthy</span>
1088
- </div>
1089
- </div>
1090
- <div class="security-content">
1091
- <div>
1092
- <p class="security-details"><strong>Implementation:</strong> Host entropy mirroring + rngd sidecar container</p>
1093
- <p class="security-details"><strong>Mount:</strong> /dev/random and /dev/urandom bind-mounted from host</p>
1094
- <p class="security-details"><strong>Current Pool:</strong> 3847 bits available</p>
1095
- <p class="security-details"><strong>Sidecar:</strong> rngd actively feeding entropy from hardware sources</p>
1096
- </div>
1097
- <div class="security-actions">
1098
- <button class="btn btn-sm btn-secondary view-details" data-target="entropy">
1099
- <i class="fas fa-info-circle"></i> Details
1100
- </button>
1101
- </div>
1102
- </div>
1103
- </div>
1104
-
1105
- <!-- Dual Security Layers Item -->
1106
- <div class="security-item">
1107
- <div class="security-header">
1108
- <h3 class="security-title"><i class="fas fa-layer-group"></i> Dual MAC + Seccomp (FIXED)</h3>
1109
- <div class="security-status">
1110
- <div class="status-indicator"></div>
1111
- <span>Both Active</span>
1112
- </div>
1113
- </div>
1114
- <div class="security-content">
1115
- <div>
1116
- <p class="security-details"><strong>AppArmor Profile:</strong> usr.bin.gemma (enforce mode)</p>
1117
- <p class="security-details"><strong>Seccomp Filter:</strong> 45 syscalls allowlist (strict mode)</p>
1118
- <p class="security-details"><strong>Defense Layers:</strong> Mandatory Access Control + System Call Filtering</p>
1119
- <p class="security-details"><strong>Block Rate:</strong> 85.6% of syscalls blocked</p>
1120
- </div>
1121
- <div class="security-actions">
1122
- <button class="btn btn-sm btn-secondary view-details" data-target="dual-security">
1123
- <i class="fas fa-info-circle"></i> Details
1124
- </button>
1125
- </div>
1126
- </div>
1127
- </div>
1128
-
1129
- <!-- Forensic Logging Item -->
1130
- <div class="security-item">
1131
- <div class="security-header">
1132
- <h3 class="security-title"><i class="fas fa-file-alt"></i> Forensic Logging (FIXED)</h3>
1133
- <div class="security-status">
1134
- <div class="status-indicator"></div>
1135
- <span>Persistent</span>
1136
- </div>
1137
- </div>
1138
- <div class="security-content">
1139
- <div>
1140
- <p class="security-details"><strong>Log Mount:</strong> Host directory bind-mounted to /var/log</p>
1141
- <p class="security-details"><strong>Host Path:</strong> /var/log/gemma-container/</p>
1142
- <p class="security-details"><strong>Retention:</strong> Logs persist across container restarts</p>
1143
- <p class="security
 
5
  <meta charset="UTF-8">
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
8
+ <meta name="description" content="Hardened Gemma 3 LLM Container Security Dashboard - Enhanced Security Edition">
9
+ <title>Gemma 3 Hardened Container Dashboard - Enhanced Security</title>
10
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
11
  <style>
12
  :root {
 
20
  --info: #17a2b8;
21
  --light: #f8f9fa;
22
  --dark: #0a0a0f;
23
+ --purple: #9b59b6;
24
+ --orange: #e67e22;
25
  --shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
26
  --radius: 12px;
27
  --transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
 
60
  display: flex;
61
  justify-content: space-between;
62
  align-items: center;
63
+ max-width: 1800px;
64
  margin: 0 auto;
65
  width: 100%;
66
  }
 
69
  display: flex;
70
  align-items: center;
71
  gap: 1rem;
72
+ flex-wrap: wrap;
73
  }
74
 
75
  .logo {
 
102
  color: var(--highlight);
103
  }
104
 
105
+ .security-level-badge {
106
+ background: linear-gradient(135deg, var(--success), #00b386);
107
+ padding: 0.3rem 0.8rem;
108
+ border-radius: 20px;
109
+ font-size: 0.75rem;
110
+ font-weight: 600;
111
+ color: white;
112
+ display: flex;
113
+ align-items: center;
114
+ gap: 0.3rem;
115
+ }
116
+
117
  .built-with {
118
  font-size: 0.85rem;
119
  opacity: 0.9;
 
144
  display: flex;
145
  list-style: none;
146
  gap: 0.5rem;
147
+ flex-wrap: wrap;
148
  }
149
 
150
  nav a {
 
185
  /* Main Content */
186
  main {
187
  flex: 1;
188
+ max-width: 1800px;
189
  margin: 2rem auto;
190
  padding: 0 1.5rem;
191
  width: 100%;
 
205
  color: var(--highlight);
206
  }
207
 
208
+ /* Security Score */
209
+ .security-score-container {
210
+ background: linear-gradient(135deg, rgba(26, 26, 46, 0.95) 0%, rgba(22, 33, 62, 0.95) 100%);
211
+ border-radius: var(--radius);
212
+ padding: 2rem;
213
+ margin-bottom: 2rem;
214
+ border: 1px solid rgba(0, 217, 160, 0.3);
215
+ display: grid;
216
+ grid-template-columns: auto 1fr;
217
+ gap: 2rem;
218
+ align-items: center;
219
+ }
220
+
221
+ .score-circle {
222
+ width: 150px;
223
+ height: 150px;
224
+ border-radius: 50%;
225
+ background: conic-gradient(var(--success) 0deg, var(--success) 324deg, rgba(255,255,255,0.1) 324deg);
226
+ display: flex;
227
+ align-items: center;
228
+ justify-content: center;
229
+ position: relative;
230
+ }
231
+
232
+ .score-circle::before {
233
+ content: '';
234
+ position: absolute;
235
+ width: 120px;
236
+ height: 120px;
237
+ background: var(--primary);
238
+ border-radius: 50%;
239
+ }
240
+
241
+ .score-value {
242
+ position: relative;
243
+ z-index: 1;
244
+ font-size: 2.5rem;
245
+ font-weight: 700;
246
+ color: var(--success);
247
+ }
248
+
249
+ .score-details {
250
+ flex: 1;
251
+ }
252
+
253
+ .score-title {
254
+ font-size: 1.5rem;
255
+ margin-bottom: 0.5rem;
256
+ color: var(--light);
257
+ }
258
+
259
+ .score-subtitle {
260
+ color: rgba(255,255,255,0.7);
261
+ margin-bottom: 1rem;
262
+ }
263
+
264
+ .score-breakdown {
265
+ display: grid;
266
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
267
+ gap: 1rem;
268
+ }
269
+
270
+ .score-item {
271
+ background: rgba(255,255,255,0.05);
272
+ padding: 0.8rem;
273
+ border-radius: 8px;
274
+ text-align: center;
275
+ }
276
+
277
+ .score-item-value {
278
+ font-size: 1.3rem;
279
+ font-weight: 600;
280
+ color: var(--success);
281
+ }
282
+
283
+ .score-item-label {
284
+ font-size: 0.75rem;
285
+ color: rgba(255,255,255,0.6);
286
+ text-transform: uppercase;
287
+ }
288
+
289
  /* Dashboard Grid */
290
  .dashboard-grid {
291
  display: grid;
 
325
  background: linear-gradient(90deg, var(--highlight), var(--success));
326
  }
327
 
328
+ .card.new-feature::before {
329
+ background: linear-gradient(90deg, var(--purple), var(--info));
330
+ }
331
+
332
+ .card.enhanced::before {
333
+ background: linear-gradient(90deg, var(--success), #00ff88);
334
+ }
335
+
336
+ .card-badge {
337
+ position: absolute;
338
+ top: 1rem;
339
+ right: 1rem;
340
+ padding: 0.2rem 0.6rem;
341
+ border-radius: 12px;
342
+ font-size: 0.65rem;
343
+ font-weight: 600;
344
+ text-transform: uppercase;
345
+ }
346
+
347
+ .badge-new {
348
+ background: var(--purple);
349
+ color: white;
350
+ }
351
+
352
+ .badge-enhanced {
353
+ background: var(--success);
354
+ color: white;
355
+ }
356
+
357
+ .badge-critical {
358
+ background: var(--danger);
359
+ color: white;
360
+ }
361
+
362
  .card-icon {
363
  width: 48px;
364
  height: 48px;
 
373
  box-shadow: 0 4px 15px rgba(233, 69, 96, 0.3);
374
  }
375
 
376
+ .card-icon.purple {
377
+ background: linear-gradient(135deg, var(--purple), #8e44ad);
378
+ }
379
+
380
+ .card-icon.green {
381
+ background: linear-gradient(135deg, var(--success), #00b386);
382
+ }
383
+
384
+ .card-icon.blue {
385
+ background: linear-gradient(135deg, var(--info), #138496);
386
+ }
387
+
388
+ .card-icon.orange {
389
+ background: linear-gradient(135deg, var(--orange), #d35400);
390
+ }
391
+
392
  .card-title {
393
  font-size: 1.15rem;
394
  margin-bottom: 0.6rem;
 
439
  font-weight: 500;
440
  }
441
 
442
+ /* Security Layers Section */
443
+ .security-layers {
444
+ background: linear-gradient(135deg, rgba(26, 26, 46, 0.95) 0%, rgba(22, 33, 62, 0.95) 100%);
445
+ border-radius: var(--radius);
446
+ padding: 2rem;
447
+ margin-bottom: 2rem;
448
+ border: 1px solid rgba(255, 255, 255, 0.1);
449
+ }
450
+
451
+ .layers-title {
452
+ font-size: 1.3rem;
453
+ margin-bottom: 1.5rem;
454
+ color: var(--light);
455
+ display: flex;
456
+ align-items: center;
457
+ gap: 0.5rem;
458
+ }
459
+
460
+ .layers-title i {
461
+ color: var(--highlight);
462
+ }
463
+
464
+ .layer-diagram {
465
+ display: flex;
466
+ flex-direction: column;
467
+ gap: 0.5rem;
468
+ }
469
+
470
+ .layer {
471
+ padding: 1rem 1.5rem;
472
+ border-radius: 8px;
473
+ display: flex;
474
+ align-items: center;
475
+ justify-content: space-between;
476
+ transition: var(--transition);
477
+ cursor: pointer;
478
+ }
479
+
480
+ .layer:hover {
481
+ transform: translateX(10px);
482
+ }
483
+
484
+ .layer-external {
485
+ background: linear-gradient(90deg, rgba(220, 53, 69, 0.3), rgba(220, 53, 69, 0.1));
486
+ border-left: 4px solid var(--danger);
487
+ }
488
+
489
+ .layer-network {
490
+ background: linear-gradient(90deg, rgba(230, 126, 34, 0.3), rgba(230, 126, 34, 0.1));
491
+ border-left: 4px solid var(--orange);
492
+ }
493
+
494
+ .layer-host {
495
+ background: linear-gradient(90deg, rgba(255, 193, 7, 0.3), rgba(255, 193, 7, 0.1));
496
+ border-left: 4px solid var(--warning);
497
+ }
498
+
499
+ .layer-runtime {
500
+ background: linear-gradient(90deg, rgba(23, 162, 184, 0.3), rgba(23, 162, 184, 0.1));
501
+ border-left: 4px solid var(--info);
502
+ }
503
+
504
+ .layer-container {
505
+ background: linear-gradient(90deg, rgba(155, 89, 182, 0.3), rgba(155, 89, 182, 0.1));
506
+ border-left: 4px solid var(--purple);
507
+ }
508
+
509
+ .layer-application {
510
+ background: linear-gradient(90deg, rgba(0, 217, 160, 0.3), rgba(0, 217, 160, 0.1));
511
+ border-left: 4px solid var(--success);
512
+ }
513
+
514
+ .layer-info {
515
+ display: flex;
516
+ align-items: center;
517
+ gap: 1rem;
518
+ }
519
+
520
+ .layer-name {
521
+ font-weight: 600;
522
+ color: var(--light);
523
+ }
524
+
525
+ .layer-controls {
526
+ display: flex;
527
+ gap: 0.5rem;
528
+ flex-wrap: wrap;
529
+ }
530
+
531
+ .layer-control {
532
+ background: rgba(0, 0, 0, 0.3);
533
+ padding: 0.3rem 0.6rem;
534
+ border-radius: 4px;
535
+ font-size: 0.7rem;
536
+ color: rgba(255, 255, 255, 0.8);
537
+ }
538
+
539
+ /* Improvement Categories */
540
+ .improvements-section {
541
+ margin-bottom: 2rem;
542
+ }
543
+
544
+ .improvements-tabs {
545
+ display: flex;
546
+ gap: 0.5rem;
547
+ margin-bottom: 1.5rem;
548
+ flex-wrap: wrap;
549
+ }
550
+
551
+ .improvement-tab {
552
+ padding: 0.8rem 1.5rem;
553
+ background: rgba(255, 255, 255, 0.05);
554
+ border: 1px solid rgba(255, 255, 255, 0.1);
555
+ border-radius: 8px;
556
+ color: rgba(255, 255, 255, 0.7);
557
+ cursor: pointer;
558
+ transition: var(--transition);
559
+ font-size: 0.9rem;
560
+ display: flex;
561
+ align-items: center;
562
+ gap: 0.5rem;
563
+ }
564
+
565
+ .improvement-tab:hover {
566
+ background: rgba(255, 255, 255, 0.1);
567
+ color: var(--light);
568
+ }
569
+
570
+ .improvement-tab.active {
571
+ background: linear-gradient(135deg, var(--highlight), #ff6b6b);
572
+ color: white;
573
+ border-color: var(--highlight);
574
+ }
575
+
576
+ .improvement-content {
577
+ display: none;
578
+ }
579
+
580
+ .improvement-content.active {
581
+ display: block;
582
+ }
583
+
584
  /* Security Controls Section */
585
  .security-section {
586
  background: linear-gradient(135deg, rgba(26, 26, 46, 0.95) 0%, rgba(22, 33, 62, 0.95) 100%);
 
656
  background: rgba(255, 255, 255, 0.2);
657
  }
658
 
659
+ .btn-success {
660
+ background: linear-gradient(135deg, var(--success), #00b386);
661
+ color: white;
662
+ }
663
+
664
+ .btn-success:hover {
665
+ transform: translateY(-2px);
666
+ box-shadow: 0 4px 15px rgba(0, 217, 160, 0.4);
667
+ }
668
+
669
  /* Security Item */
670
  .security-item {
671
  margin-bottom: 1rem;
 
689
  border-left-color: var(--danger);
690
  }
691
 
692
+ .security-item.new {
693
+ border-left-color: var(--purple);
694
+ }
695
+
696
+ .security-item.enhanced {
697
+ border-left-color: var(--info);
698
+ }
699
+
700
  .security-header {
701
  display: flex;
702
  justify-content: space-between;
 
784
  color: #4ec9b0;
785
  }
786
 
787
+ /* Threat Model Section */
788
+ .threat-model {
789
+ background: linear-gradient(135deg, rgba(26, 26, 46, 0.95) 0%, rgba(22, 33, 62, 0.95) 100%);
790
+ border-radius: var(--radius);
791
+ padding: 1.5rem;
792
+ margin-bottom: 2rem;
793
+ border: 1px solid rgba(255, 255, 255, 0.1);
794
+ }
795
+
796
+ .threat-grid {
797
+ display: grid;
798
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
799
+ gap: 1rem;
800
+ }
801
+
802
+ .threat-card {
803
+ background: rgba(0, 0, 0, 0.3);
804
+ border-radius: 8px;
805
+ padding: 1.2rem;
806
+ border: 1px solid rgba(255, 255, 255, 0.1);
807
+ }
808
+
809
+ .threat-header {
810
+ display: flex;
811
+ align-items: center;
812
+ gap: 0.8rem;
813
+ margin-bottom: 0.8rem;
814
+ }
815
+
816
+ .threat-icon {
817
+ width: 36px;
818
+ height: 36px;
819
+ border-radius: 50%;
820
+ display: flex;
821
+ align-items: center;
822
+ justify-content: center;
823
+ font-size: 1rem;
824
+ }
825
+
826
+ .threat-icon.high {
827
+ background: rgba(220, 53, 69, 0.3);
828
+ color: var(--danger);
829
+ }
830
+
831
+ .threat-icon.medium {
832
+ background: rgba(255, 193, 7, 0.3);
833
+ color: var(--warning);
834
+ }
835
+
836
+ .threat-icon.low {
837
+ background: rgba(0, 217, 160, 0.3);
838
+ color: var(--success);
839
+ }
840
+
841
+ .threat-title {
842
+ font-weight: 600;
843
+ color: var(--light);
844
+ font-size: 0.95rem;
845
+ }
846
+
847
+ .threat-description {
848
+ color: rgba(255, 255, 255, 0.7);
849
+ font-size: 0.8rem;
850
+ margin-bottom: 0.8rem;
851
+ }
852
+
853
+ .threat-mitigation {
854
+ background: rgba(0, 217, 160, 0.1);
855
+ padding: 0.6rem;
856
+ border-radius: 6px;
857
+ font-size: 0.75rem;
858
+ color: var(--success);
859
+ border-left: 3px solid var(--success);
860
+ }
861
+
862
  /* System Health Section */
863
  .health-section {
864
  display: grid;
865
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
866
  gap: 1rem;
867
  margin-bottom: 2rem;
868
  }
 
945
  display: flex;
946
  background: rgba(0, 0, 0, 0.3);
947
  border-bottom: 1px solid rgba(255, 255, 255, 0.1);
948
+ overflow-x: auto;
949
  }
950
 
951
  .script-tab {
 
957
  transition: var(--transition);
958
  font-size: 0.85rem;
959
  border-bottom: 2px solid transparent;
960
+ white-space: nowrap;
961
  }
962
 
963
  .script-tab:hover {
 
973
 
974
  .script-content {
975
  padding: 1rem;
976
+ max-height: 600px;
977
  overflow-y: auto;
978
  }
979
 
 
1019
  color: var(--info);
1020
  }
1021
 
1022
+ .alert-purple {
1023
+ background: rgba(155, 89, 182, 0.15);
1024
+ border: 1px solid rgba(155, 89, 182, 0.3);
1025
+ color: var(--purple);
1026
+ }
1027
+
1028
  .alert i {
1029
  font-size: 1.2rem;
1030
  margin-top: 0.1rem;
 
1044
  opacity: 0.9;
1045
  }
1046
 
1047
+ /* Checklist */
1048
+ .checklist {
1049
+ list-style: none;
1050
+ padding: 0;
1051
+ }
1052
+
1053
+ .checklist-item {
1054
+ display: flex;
1055
+ align-items: flex-start;
1056
+ gap: 0.8rem;
1057
+ padding: 0.8rem;
1058
+ background: rgba(255, 255, 255, 0.03);
1059
+ border-radius: 8px;
1060
+ margin-bottom: 0.5rem;
1061
+ transition: var(--transition);
1062
+ }
1063
+
1064
+ .checklist-item:hover {
1065
+ background: rgba(255, 255, 255, 0.06);
1066
+ }
1067
+
1068
+ .checklist-icon {
1069
+ width: 24px;
1070
+ height: 24px;
1071
+ border-radius: 50%;
1072
+ display: flex;
1073
+ align-items: center;
1074
+ justify-content: center;
1075
+ font-size: 0.75rem;
1076
+ flex-shrink: 0;
1077
+ }
1078
+
1079
+ .checklist-icon.done {
1080
+ background: var(--success);
1081
+ color: white;
1082
+ }
1083
+
1084
+ .checklist-icon.pending {
1085
+ background: var(--warning);
1086
+ color: white;
1087
+ }
1088
+
1089
+ .checklist-icon.new {
1090
+ background: var(--purple);
1091
+ color: white;
1092
+ }
1093
+
1094
+ .checklist-content {
1095
+ flex: 1;
1096
+ }
1097
+
1098
+ .checklist-title {
1099
+ font-weight: 600;
1100
+ color: var(--light);
1101
+ font-size: 0.9rem;
1102
+ margin-bottom: 0.2rem;
1103
+ }
1104
+
1105
+ .checklist-description {
1106
+ color: rgba(255, 255, 255, 0.6);
1107
+ font-size: 0.8rem;
1108
+ }
1109
+
1110
  /* Modal */
1111
  .modal {
1112
  position: fixed;
 
1135
  border-radius: var(--radius);
1136
  padding: 1.5rem;
1137
  width: 90%;
1138
+ max-width: 1000px;
1139
  max-height: 90vh;
1140
  overflow-y: auto;
1141
  box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5);
 
1210
  .modal-footer {
1211
  display: flex;
1212
  justify-content: flex-end;
1213
+ gap: