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

Upload folder using huggingface_hub

Browse files
Files changed (1) hide show
  1. index.html +658 -691
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 - 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 {
@@ -22,6 +22,7 @@
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);
@@ -63,6 +64,8 @@
63
  max-width: 1800px;
64
  margin: 0 auto;
65
  width: 100%;
 
 
66
  }
67
 
68
  .logo-container {
@@ -73,7 +76,7 @@
73
  }
74
 
75
  .logo {
76
- font-size: 1.6rem;
77
  font-weight: 700;
78
  display: flex;
79
  align-items: center;
@@ -96,17 +99,17 @@
96
  background: linear-gradient(135deg, var(--accent), var(--secondary));
97
  padding: 0.3rem 0.8rem;
98
  border-radius: 20px;
99
- font-size: 0.75rem;
100
  font-weight: 600;
101
  border: 1px solid rgba(233, 69, 96, 0.5);
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;
@@ -114,6 +117,21 @@
114
  gap: 0.3rem;
115
  }
116
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
117
  .built-with {
118
  font-size: 0.85rem;
119
  opacity: 0.9;
@@ -135,11 +153,6 @@
135
  }
136
 
137
  /* Navigation */
138
- nav {
139
- display: flex;
140
- gap: 1.5rem;
141
- }
142
-
143
  nav ul {
144
  display: flex;
145
  list-style: none;
@@ -154,32 +167,12 @@
154
  border-radius: var(--radius);
155
  transition: var(--transition);
156
  font-weight: 500;
157
- font-size: 0.9rem;
158
  position: relative;
159
- overflow: hidden;
160
  }
161
 
162
  nav a:hover {
163
  background: rgba(233, 69, 96, 0.2);
164
- transform: translateY(-2px);
165
- }
166
-
167
- nav a::after {
168
- content: '';
169
- position: absolute;
170
- bottom: 0;
171
- left: 0;
172
- width: 100%;
173
- height: 2px;
174
- background: var(--highlight);
175
- transform: scaleX(0);
176
- transform-origin: right;
177
- transition: var(--transition);
178
- }
179
-
180
- nav a:hover::after {
181
- transform: scaleX(1);
182
- transform-origin: left;
183
  }
184
 
185
  /* Main Content */
@@ -191,717 +184,459 @@
191
  width: 100%;
192
  }
193
 
194
- /* Section Title */
195
- .section-title-main {
196
- font-size: 1.8rem;
197
- margin-bottom: 1.5rem;
198
- color: var(--light);
199
- display: flex;
200
- align-items: center;
201
- gap: 0.8rem;
 
202
  }
203
 
204
- .section-title-main i {
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;
292
- grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
293
- gap: 1.5rem;
294
- margin-bottom: 2.5rem;
 
 
295
  }
296
 
297
- /* Card Styles */
298
- .card {
299
- background: linear-gradient(135deg, rgba(26, 26, 46, 0.9) 0%, rgba(22, 33, 62, 0.9) 100%);
300
- backdrop-filter: blur(10px);
 
 
 
301
  border-radius: var(--radius);
302
- box-shadow: var(--shadow);
303
- padding: 1.5rem;
304
- transition: var(--transition);
305
- position: relative;
 
 
 
 
 
306
  overflow: hidden;
307
- display: flex;
308
- flex-direction: column;
309
  border: 1px solid rgba(255, 255, 255, 0.1);
310
  }
311
 
312
- .card:hover {
313
- transform: translateY(-5px);
314
- box-shadow: 0 8px 30px rgba(233, 69, 96, 0.2);
315
- border-color: rgba(233, 69, 96, 0.3);
 
 
 
 
 
316
  }
317
 
318
- .card::before {
319
- content: '';
320
- position: absolute;
321
- top: 0;
322
- left: 0;
323
- width: 100%;
324
- height: 3px;
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;
365
- border-radius: 50%;
 
 
 
 
 
 
 
 
 
366
  display: flex;
367
  align-items: center;
368
- justify-content: center;
369
- font-size: 1.3rem;
370
- margin-bottom: 1rem;
371
- background: linear-gradient(135deg, var(--highlight), #ff6b6b);
372
- color: white;
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;
395
- color: var(--light);
396
- font-weight: 600;
397
  }
398
 
399
- .card-description {
400
- color: rgba(255, 255, 255, 0.7);
401
- margin-bottom: 1rem;
402
- flex: 1;
403
- font-size: 0.9rem;
404
  }
405
 
406
- .card-status {
 
 
 
 
407
  display: flex;
408
  align-items: center;
409
- gap: 0.5rem;
410
- margin-top: auto;
411
- }
412
-
413
- .status-indicator {
414
- width: 10px;
415
- height: 10px;
416
- border-radius: 50%;
417
- background: var(--success);
418
- box-shadow: 0 0 10px rgba(0, 217, 160, 0.5);
419
- animation: pulse 2s infinite;
420
- }
421
-
422
- @keyframes pulse {
423
- 0%, 100% { opacity: 1; }
424
- 50% { opacity: 0.6; }
425
- }
426
-
427
- .status-warning .status-indicator {
428
- background: var(--warning);
429
- box-shadow: 0 0 10px rgba(255, 193, 7, 0.5);
430
- }
431
-
432
- .status-danger .status-indicator {
433
- background: var(--danger);
434
- box-shadow: 0 0 10px rgba(220, 53, 69, 0.5);
435
- }
436
-
437
- .status-text {
438
- font-size: 0.85rem;
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%);
587
  backdrop-filter: blur(10px);
588
  border-radius: var(--radius);
589
  box-shadow: var(--shadow);
590
  padding: 1.5rem;
591
- margin-bottom: 2rem;
592
- border: 1px solid rgba(255, 255, 255, 0.1);
593
- }
594
-
595
- .section-header {
596
- display: flex;
597
- justify-content: space-between;
598
- align-items: center;
599
- margin-bottom: 1.5rem;
600
- padding-bottom: 1rem;
601
- border-bottom: 1px solid rgba(255, 255, 255, 0.1);
602
- flex-wrap: wrap;
603
- gap: 1rem;
604
- }
605
-
606
- .section-title {
607
- font-size: 1.3rem;
608
- color: var(--light);
609
- font-weight: 600;
610
- display: flex;
611
- align-items: center;
612
- gap: 0.5rem;
613
- }
614
-
615
- .section-title i {
616
- color: var(--highlight);
617
- }
618
-
619
- .section-actions {
620
- display: flex;
621
- gap: 0.8rem;
622
- flex-wrap: wrap;
623
- }
624
-
625
- .btn {
626
- padding: 0.5rem 1rem;
627
- border-radius: 8px;
628
- text-decoration: none;
629
- font-weight: 500;
630
  transition: var(--transition);
631
- border: none;
632
- cursor: pointer;
633
- display: flex;
634
- align-items: center;
635
- gap: 0.5rem;
636
- font-size: 0.85rem;
637
- }
638
-
639
- .btn-primary {
640
- background: linear-gradient(135deg, var(--highlight), #ff6b6b);
641
- color: white;
642
- }
643
-
644
- .btn-primary:hover {
645
- transform: translateY(-2px);
646
- box-shadow: 0 4px 15px rgba(233, 69, 96, 0.4);
647
- }
648
-
649
- .btn-secondary {
650
- background: rgba(255, 255, 255, 0.1);
651
- color: var(--light);
652
- border: 1px solid rgba(255, 255, 255, 0.2);
653
- }
654
-
655
- .btn-secondary:hover {
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;
672
- padding: 1.2rem;
673
- border-radius: var(--radius);
674
- background: rgba(255, 255, 255, 0.05);
675
- border-left: 4px solid var(--success);
676
- transition: var(--transition);
677
- }
678
-
679
- .security-item:hover {
680
- background: rgba(255, 255, 255, 0.08);
681
- transform: translateX(5px);
682
- }
683
-
684
- .security-item.warning {
685
- border-left-color: var(--warning);
686
- }
687
-
688
- .security-item.danger {
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;
703
- align-items: center;
704
- margin-bottom: 0.8rem;
705
- flex-wrap: wrap;
706
- gap: 0.5rem;
707
- }
708
-
709
- .security-title {
710
- font-weight: 600;
711
- color: var(--light);
712
- display: flex;
713
- align-items: center;
714
- gap: 0.5rem;
715
- }
716
-
717
- .security-title i {
718
- color: var(--highlight);
719
- font-size: 0.9rem;
720
- }
721
-
722
- .security-status {
723
- display: flex;
724
- align-items: center;
725
- gap: 0.5rem;
726
- font-size: 0.85rem;
727
- }
728
-
729
- .security-content {
730
- display: grid;
731
- grid-template-columns: 1fr auto;
732
- gap: 1rem;
733
- }
734
-
735
- .security-details {
736
- color: rgba(255, 255, 255, 0.7);
737
- margin-bottom: 0.4rem;
738
- font-size: 0.85rem;
739
- }
740
-
741
- .security-details strong {
742
- color: var(--light);
743
- }
744
-
745
- .security-actions {
746
  display: flex;
747
  flex-direction: column;
748
- gap: 0.5rem;
749
- align-items: flex-end;
750
- }
751
-
752
- .btn-sm {
753
- padding: 0.3rem 0.6rem;
754
- font-size: 0.75rem;
755
- }
756
-
757
- /* Code Block */
758
- .code-block {
759
- background: rgba(0, 0, 0, 0.4);
760
- border-radius: 8px;
761
- padding: 1rem;
762
- font-family: 'Courier New', monospace;
763
- font-size: 0.8rem;
764
- overflow-x: auto;
765
  border: 1px solid rgba(255, 255, 255, 0.1);
766
- margin: 0.5rem 0;
767
- white-space: pre-wrap;
768
- word-break: break-all;
769
- }
770
-
771
- .code-block .comment {
772
- color: #6a9955;
773
  }
774
 
775
- .code-block .keyword {
776
- color: var(--highlight);
 
 
777
  }
778
 
779
- .code-block .string {
780
- color: #ce9178;
 
 
 
 
 
 
781
  }
782
 
783
- .code-block .flag {
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
  }
869
 
870
- .health-card {
871
- background: linear-gradient(135deg, rgba(26, 26, 46, 0.9) 0%, rgba(22, 33, 62, 0.9) 100%);
872
- border-radius: var(--radius);
873
- padding: 1.2rem;
874
- text-align: center;
875
- box-shadow: var(--shadow);
876
- transition: var(--transition);
877
- border: 1px solid rgba(255, 255, 255, 0.1);
878
  }
879
 
880
- .health-card:hover {
881
- transform: translateY(-3px);
882
- border-color: rgba(233, 69, 96, 0.3);
 
 
883
  }
884
 
885
- .health-value {
886
- font-size: 1.8rem;
887
- font-weight: 700;
888
- color: var(--success);
889
- margin-bottom: 0.3rem;
890
  }
891
 
892
- .health-value.warning {
893
- color: var(--warning);
 
 
 
 
 
894
  }
895
 
896
- .health-value.danger {
897
- color: var(--danger);
 
898
  }
899
 
900
- .health-label {
901
- color: rgba(255, 255, 255, 0.7);
902
- font-size: 0.8rem;
903
- text-transform: uppercase;
904
- letter-spacing: 1px;
905
  }
906
 
907
  /* Script Section */
@@ -955,7 +690,7 @@
955
  color: rgba(255, 255, 255, 0.7);
956
  cursor: pointer;
957
  transition: var(--transition);
958
- font-size: 0.85rem;
959
  border-bottom: 2px solid transparent;
960
  white-space: nowrap;
961
  }
@@ -979,12 +714,57 @@
979
 
980
  .script-content pre {
981
  margin: 0;
982
- font-family: 'Courier New', monospace;
983
- font-size: 0.75rem;
984
  line-height: 1.5;
985
  color: #d4d4d4;
986
  }
987
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
988
  /* Alert Box */
989
  .alert {
990
  padding: 1rem 1.2rem;
@@ -995,16 +775,10 @@
995
  gap: 0.8rem;
996
  }
997
 
998
- .alert-warning {
999
- background: rgba(255, 193, 7, 0.15);
1000
- border: 1px solid rgba(255, 193, 7, 0.3);
1001
- color: var(--warning);
1002
- }
1003
-
1004
  .alert-success {
1005
- background: rgba(0, 217, 160, 0.15);
1006
- border: 1px solid rgba(0, 217, 160, 0.3);
1007
- color: var(--success);
1008
  }
1009
 
1010
  .alert-danger {
@@ -1013,18 +787,18 @@
1013
  color: var(--danger);
1014
  }
1015
 
 
 
 
 
 
 
1016
  .alert-info {
1017
  background: rgba(23, 162, 184, 0.15);
1018
  border: 1px solid rgba(23, 162, 184, 0.3);
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,6 +818,96 @@
1044
  opacity: 0.9;
1045
  }
1046
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1047
  /* Checklist */
1048
  .checklist {
1049
  list-style: none;
@@ -1072,22 +936,17 @@
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
 
@@ -1098,116 +957,224 @@
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;
1113
- top: 0;
1114
- left: 0;
1115
- width: 100%;
1116
- height: 100%;
1117
- background: rgba(0, 0, 0, 0.8);
1118
- display: flex;
1119
- align-items: center;
1120
- justify-content: center;
1121
- z-index: 2000;
1122
- opacity: 0;
1123
- visibility: hidden;
1124
- transition: var(--transition);
1125
- backdrop-filter: blur(5px);
1126
  }
1127
 
1128
- .modal.active {
1129
- opacity: 1;
1130
- visibility: visible;
1131
  }
1132
 
1133
- .modal-content {
1134
- background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
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);
1142
- transform: scale(0.9);
1143
- transition: var(--transition);
1144
- border: 1px solid rgba(255, 255, 255, 0.1);
1145
  }
1146
 
1147
- .modal.active .modal-content {
1148
- transform: scale(1);
 
 
 
1149
  }
1150
 
1151
- .modal-header {
1152
- display: flex;
1153
- justify-content: space-between;
1154
- align-items: center;
1155
- margin-bottom: 1.5rem;
1156
- padding-bottom: 1rem;
1157
- border-bottom: 1px solid rgba(255, 255, 255, 0.1);
1158
  }
1159
 
1160
- .modal-title {
1161
- font-size: 1.3rem;
1162
- color: var(--light);
1163
- font-weight: 600;
1164
  }
1165
 
1166
- .close-btn {
1167
- background: none;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1168
  border: none;
1169
- font-size: 1.3rem;
1170
  color: rgba(255, 255, 255, 0.7);
 
 
1171
  cursor: pointer;
 
1172
  transition: var(--transition);
1173
- padding: 0.3rem;
1174
  }
1175
 
1176
- .close-btn:hover {
1177
- color: var(--danger);
 
1178
  }
1179
 
1180
- .modal-body {
1181
- margin-bottom: 1.5rem;
 
1182
  }
1183
 
1184
- .detail-section {
1185
- margin-bottom: 1.5rem;
 
 
 
 
1186
  }
1187
 
1188
- .detail-title {
1189
- font-weight: 600;
1190
- color: var(--highlight);
1191
- margin-bottom: 0.5rem;
1192
- font-size: 1rem;
1193
  }
1194
 
1195
- .detail-content {
1196
- color: rgba(255, 255, 255, 0.8);
1197
- line-height: 1.7;
1198
- font-size: 0.9rem;
1199
  }
1200
 
1201
- .detail-content ul {
1202
- margin-left: 1.5rem;
1203
- margin-top: 0.5rem;
1204
  }
1205
 
1206
- .detail-content li {
1207
- margin-bottom: 0.3rem;
1208
  }
1209
-
1210
- .modal-footer {
1211
- display: flex;
1212
- justify-content: flex-end;
1213
- gap:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 - Critical Fixes Applied">
9
+ <title>Gemma 3 Hardened Container Dashboard - Critical Fixes v2.0</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 {
 
22
  --dark: #0a0a0f;
23
  --purple: #9b59b6;
24
  --orange: #e67e22;
25
+ --fixed: #2ecc71;
26
  --shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
27
  --radius: 12px;
28
  --transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
 
64
  max-width: 1800px;
65
  margin: 0 auto;
66
  width: 100%;
67
+ flex-wrap: wrap;
68
+ gap: 1rem;
69
  }
70
 
71
  .logo-container {
 
76
  }
77
 
78
  .logo {
79
+ font-size: 1.5rem;
80
  font-weight: 700;
81
  display: flex;
82
  align-items: center;
 
99
  background: linear-gradient(135deg, var(--accent), var(--secondary));
100
  padding: 0.3rem 0.8rem;
101
  border-radius: 20px;
102
+ font-size: 0.7rem;
103
  font-weight: 600;
104
  border: 1px solid rgba(233, 69, 96, 0.5);
105
  color: var(--highlight);
106
  }
107
 
108
+ .version-badge {
109
+ background: linear-gradient(135deg, var(--fixed), #27ae60);
110
  padding: 0.3rem 0.8rem;
111
  border-radius: 20px;
112
+ font-size: 0.7rem;
113
  font-weight: 600;
114
  color: white;
115
  display: flex;
 
117
  gap: 0.3rem;
118
  }
119
 
120
+ .fixes-badge {
121
+ background: linear-gradient(135deg, var(--danger), #c0392b);
122
+ padding: 0.3rem 0.8rem;
123
+ border-radius: 20px;
124
+ font-size: 0.7rem;
125
+ font-weight: 600;
126
+ color: white;
127
+ animation: pulse-badge 2s infinite;
128
+ }
129
+
130
+ @keyframes pulse-badge {
131
+ 0%, 100% { opacity: 1; }
132
+ 50% { opacity: 0.7; }
133
+ }
134
+
135
  .built-with {
136
  font-size: 0.85rem;
137
  opacity: 0.9;
 
153
  }
154
 
155
  /* Navigation */
 
 
 
 
 
156
  nav ul {
157
  display: flex;
158
  list-style: none;
 
167
  border-radius: var(--radius);
168
  transition: var(--transition);
169
  font-weight: 500;
170
+ font-size: 0.85rem;
171
  position: relative;
 
172
  }
173
 
174
  nav a:hover {
175
  background: rgba(233, 69, 96, 0.2);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
176
  }
177
 
178
  /* Main Content */
 
184
  width: 100%;
185
  }
186
 
187
+ /* Critical Fixes Banner */
188
+ .critical-fixes-banner {
189
+ background: linear-gradient(135deg, rgba(220, 53, 69, 0.2) 0%, rgba(192, 57, 43, 0.2) 100%);
190
+ border: 2px solid var(--danger);
191
+ border-radius: var(--radius);
192
+ padding: 1.5rem;
193
+ margin-bottom: 2rem;
194
+ position: relative;
195
+ overflow: hidden;
196
  }
197
 
198
+ .critical-fixes-banner::before {
199
+ content: '';
200
+ position: absolute;
201
+ top: 0;
202
+ left: 0;
203
+ width: 100%;
204
+ height: 4px;
205
+ background: linear-gradient(90deg, var(--danger), var(--warning), var(--fixed));
206
  }
207
 
208
+ .banner-header {
209
+ display: flex;
 
 
 
 
 
 
 
 
210
  align-items: center;
211
+ gap: 1rem;
212
+ margin-bottom: 1rem;
213
  }
214
 
215
+ .banner-icon {
216
+ width: 50px;
217
+ height: 50px;
218
+ background: var(--danger);
219
  border-radius: 50%;
 
220
  display: flex;
221
  align-items: center;
222
  justify-content: center;
223
+ font-size: 1.5rem;
224
+ color: white;
225
+ animation: pulse 2s infinite;
226
  }
227
 
228
+ .banner-title {
229
+ font-size: 1.4rem;
230
+ font-weight: 700;
231
+ color: var(--danger);
 
 
 
232
  }
233
 
234
+ .banner-subtitle {
235
+ color: rgba(255, 255, 255, 0.8);
236
+ font-size: 0.9rem;
 
 
 
237
  }
238
 
239
+ .fixes-summary {
240
+ display: grid;
241
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
242
+ gap: 1rem;
243
+ margin-top: 1rem;
244
  }
245
 
246
+ .fix-item {
247
+ background: rgba(0, 0, 0, 0.3);
248
+ border-radius: 8px;
249
+ padding: 1rem;
250
+ display: flex;
251
+ align-items: flex-start;
252
+ gap: 0.8rem;
253
  }
254
 
255
+ .fix-status {
256
+ width: 24px;
257
+ height: 24px;
258
+ border-radius: 50%;
259
+ display: flex;
260
+ align-items: center;
261
+ justify-content: center;
262
+ font-size: 0.75rem;
263
+ flex-shrink: 0;
264
  }
265
 
266
+ .fix-status.fixed {
267
+ background: var(--fixed);
268
+ color: white;
 
269
  }
270
 
271
+ .fix-status.critical {
272
+ background: var(--danger);
273
+ color: white;
 
 
274
  }
275
 
276
+ .fix-content h4 {
277
+ color: var(--light);
278
+ font-size: 0.9rem;
279
+ margin-bottom: 0.3rem;
280
  }
281
 
282
+ .fix-content p {
283
+ color: rgba(255, 255, 255, 0.7);
284
+ font-size: 0.8rem;
 
285
  }
286
 
287
+ /* Section Title */
288
+ .section-title-main {
289
+ font-size: 1.6rem;
290
+ margin-bottom: 1.5rem;
291
+ color: var(--light);
292
+ display: flex;
293
+ align-items: center;
294
+ gap: 0.8rem;
295
  }
296
 
297
+ .section-title-main i {
298
+ color: var(--highlight);
299
+ }
300
+
301
+ /* Flaw Analysis Section */
302
+ .flaw-analysis {
303
+ background: linear-gradient(135deg, rgba(26, 26, 46, 0.95) 0%, rgba(22, 33, 62, 0.95) 100%);
304
  border-radius: var(--radius);
305
+ padding: 2rem;
306
+ margin-bottom: 2rem;
307
+ border: 1px solid rgba(220, 53, 69, 0.3);
308
+ }
309
+
310
+ .flaw-card {
311
+ background: rgba(0, 0, 0, 0.3);
312
+ border-radius: 8px;
313
+ margin-bottom: 1.5rem;
314
  overflow: hidden;
 
 
315
  border: 1px solid rgba(255, 255, 255, 0.1);
316
  }
317
 
318
+ .flaw-header {
319
+ background: rgba(220, 53, 69, 0.2);
320
+ padding: 1rem 1.5rem;
321
+ display: flex;
322
+ align-items: center;
323
+ justify-content: space-between;
324
+ border-bottom: 1px solid rgba(220, 53, 69, 0.3);
325
+ flex-wrap: wrap;
326
+ gap: 0.5rem;
327
  }
328
 
329
+ .flaw-header.fixed {
330
+ background: rgba(46, 204, 113, 0.2);
331
+ border-bottom-color: rgba(46, 204, 113, 0.3);
 
 
 
 
 
332
  }
333
 
334
+ .flaw-title {
335
+ display: flex;
336
+ align-items: center;
337
+ gap: 0.8rem;
338
+ font-weight: 600;
339
+ color: var(--light);
340
  }
341
 
342
+ .flaw-title i {
343
+ color: var(--danger);
344
  }
345
 
346
+ .flaw-header.fixed .flaw-title i {
347
+ color: var(--fixed);
348
+ }
349
+
350
+ .flaw-severity {
351
+ padding: 0.3rem 0.8rem;
352
+ border-radius: 20px;
353
+ font-size: 0.7rem;
354
  font-weight: 600;
355
  text-transform: uppercase;
356
  }
357
 
358
+ .severity-critical {
359
+ background: var(--danger);
360
  color: white;
361
  }
362
 
363
+ .severity-fixed {
364
+ background: var(--fixed);
365
  color: white;
366
  }
367
 
368
+ .flaw-body {
369
+ padding: 1.5rem;
 
370
  }
371
 
372
+ .flaw-section {
373
+ margin-bottom: 1.5rem;
374
+ }
375
+
376
+ .flaw-section:last-child {
377
+ margin-bottom: 0;
378
+ }
379
+
380
+ .flaw-section-title {
381
+ font-size: 0.9rem;
382
+ font-weight: 600;
383
+ color: var(--highlight);
384
+ margin-bottom: 0.5rem;
385
  display: flex;
386
  align-items: center;
387
+ gap: 0.5rem;
 
 
 
 
 
388
  }
389
 
390
+ .flaw-section-content {
391
+ color: rgba(255, 255, 255, 0.8);
392
+ font-size: 0.85rem;
393
+ line-height: 1.7;
394
  }
395
 
396
+ .comparison-grid {
397
+ display: grid;
398
+ grid-template-columns: 1fr 1fr;
399
+ gap: 1rem;
400
+ margin-top: 1rem;
401
  }
402
 
403
+ @media (max-width: 768px) {
404
+ .comparison-grid {
405
+ grid-template-columns: 1fr;
406
+ }
407
  }
408
 
409
+ .comparison-box {
410
+ background: rgba(0, 0, 0, 0.3);
411
+ border-radius: 8px;
412
+ padding: 1rem;
413
+ border: 1px solid rgba(255, 255, 255, 0.1);
414
  }
415
 
416
+ .comparison-box.before {
417
+ border-color: rgba(220, 53, 69, 0.5);
 
 
 
418
  }
419
 
420
+ .comparison-box.after {
421
+ border-color: rgba(46, 204, 113, 0.5);
 
 
 
422
  }
423
 
424
+ .comparison-label {
425
+ font-size: 0.75rem;
426
+ font-weight: 600;
427
+ text-transform: uppercase;
428
+ margin-bottom: 0.5rem;
429
  display: flex;
430
  align-items: center;
431
+ gap: 0.3rem;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
432
  }
433
 
434
+ .comparison-box.before .comparison-label {
435
+ color: var(--danger);
436
  }
437
 
438
+ .comparison-box.after .comparison-label {
439
+ color: var(--fixed);
 
 
440
  }
441
 
442
+ /* Code Block */
443
+ .code-block {
444
+ background: rgba(0, 0, 0, 0.5);
445
  border-radius: 8px;
446
+ padding: 1rem;
447
+ font-family: 'Fira Code', 'Courier New', monospace;
448
+ font-size: 0.75rem;
449
+ overflow-x: auto;
450
+ border: 1px solid rgba(255, 255, 255, 0.1);
451
+ margin: 0.5rem 0;
452
+ white-space: pre-wrap;
453
+ word-break: break-all;
454
+ line-height: 1.6;
455
  }
456
 
457
+ .code-block .comment {
458
+ color: #6a9955;
459
  }
460
 
461
+ .code-block .keyword {
462
+ color: #569cd6;
 
463
  }
464
 
465
+ .code-block .string {
466
+ color: #ce9178;
 
467
  }
468
 
469
+ .code-block .function {
470
+ color: #dcdcaa;
 
471
  }
472
 
473
+ .code-block .class {
474
+ color: #4ec9b0;
 
475
  }
476
 
477
+ .code-block .decorator {
478
+ color: #c586c0;
 
479
  }
480
 
481
+ .code-block .number {
482
+ color: #b5cea8;
 
483
  }
484
 
485
+ .code-block .error {
486
+ color: #f44747;
487
+ text-decoration: line-through;
 
488
  }
489
 
490
+ .code-block .correct {
491
+ color: #4ec9b0;
 
492
  }
493
 
494
+ .code-block .highlight-line {
495
+ background: rgba(233, 69, 96, 0.2);
496
+ display: block;
497
+ margin: 0 -1rem;
498
+ padding: 0 1rem;
499
  }
500
 
501
+ .code-block .fixed-line {
502
+ background: rgba(46, 204, 113, 0.2);
503
+ display: block;
504
+ margin: 0 -1rem;
505
+ padding: 0 1rem;
 
506
  }
507
 
508
+ /* Dashboard Grid */
509
+ .dashboard-grid {
510
+ display: grid;
511
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
512
+ gap: 1.5rem;
513
  margin-bottom: 2rem;
514
  }
515
 
516
+ /* Card Styles */
517
+ .card {
518
+ background: linear-gradient(135deg, rgba(26, 26, 46, 0.9) 0%, rgba(22, 33, 62, 0.9) 100%);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
519
  backdrop-filter: blur(10px);
520
  border-radius: var(--radius);
521
  box-shadow: var(--shadow);
522
  padding: 1.5rem;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
523
  transition: var(--transition);
524
+ position: relative;
525
+ overflow: hidden;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
526
  display: flex;
527
  flex-direction: column;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
528
  border: 1px solid rgba(255, 255, 255, 0.1);
 
 
 
 
 
 
 
529
  }
530
 
531
+ .card:hover {
532
+ transform: translateY(-5px);
533
+ box-shadow: 0 8px 30px rgba(233, 69, 96, 0.2);
534
+ border-color: rgba(233, 69, 96, 0.3);
535
  }
536
 
537
+ .card::before {
538
+ content: '';
539
+ position: absolute;
540
+ top: 0;
541
+ left: 0;
542
+ width: 100%;
543
+ height: 3px;
544
+ background: linear-gradient(90deg, var(--highlight), var(--success));
545
  }
546
 
547
+ .card.fixed::before {
548
+ background: linear-gradient(90deg, var(--fixed), #27ae60);
549
  }
550
 
551
+ .card.critical::before {
552
+ background: linear-gradient(90deg, var(--danger), var(--warning));
 
 
 
 
 
553
  }
554
 
555
+ .card-badge {
556
+ position: absolute;
557
+ top: 1rem;
558
+ right: 1rem;
559
+ padding: 0.2rem 0.6rem;
560
+ border-radius: 12px;
561
+ font-size: 0.65rem;
562
+ font-weight: 600;
563
+ text-transform: uppercase;
564
  }
565
 
566
+ .badge-fixed {
567
+ background: var(--fixed);
568
+ color: white;
 
 
569
  }
570
 
571
+ .badge-critical {
572
+ background: var(--danger);
573
+ color: white;
 
 
574
  }
575
 
576
+ .card-icon {
577
+ width: 48px;
578
+ height: 48px;
579
  border-radius: 50%;
580
  display: flex;
581
  align-items: center;
582
  justify-content: center;
583
+ font-size: 1.3rem;
584
+ margin-bottom: 1rem;
585
+ background: linear-gradient(135deg, var(--highlight), #ff6b6b);
586
+ color: white;
587
+ box-shadow: 0 4px 15px rgba(233, 69, 96, 0.3);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
588
  }
589
 
590
+ .card-icon.green {
591
+ background: linear-gradient(135deg, var(--fixed), #27ae60);
 
 
592
  }
593
 
594
+ .card-icon.blue {
595
+ background: linear-gradient(135deg, var(--info), #138496);
 
 
 
 
 
596
  }
597
+
598
+ .card-icon.orange {
599
+ background: linear-gradient(135deg, var(--orange), #d35400);
 
 
 
 
600
  }
601
 
602
+ .card-title {
603
+ font-size: 1.1rem;
604
+ margin-bottom: 0.6rem;
605
+ color: var(--light);
606
+ font-weight: 600;
 
 
 
607
  }
608
 
609
+ .card-description {
610
+ color: rgba(255, 255, 255, 0.7);
611
+ margin-bottom: 1rem;
612
+ flex: 1;
613
+ font-size: 0.85rem;
614
  }
615
 
616
+ .card-status {
617
+ display: flex;
618
+ align-items: center;
619
+ gap: 0.5rem;
620
+ margin-top: auto;
621
  }
622
 
623
+ .status-indicator {
624
+ width: 10px;
625
+ height: 10px;
626
+ border-radius: 50%;
627
+ background: var(--success);
628
+ box-shadow: 0 0 10px rgba(0, 217, 160, 0.5);
629
+ animation: pulse 2s infinite;
630
  }
631
 
632
+ @keyframes pulse {
633
+ 0%, 100% { opacity: 1; }
634
+ 50% { opacity: 0.6; }
635
  }
636
 
637
+ .status-text {
638
+ font-size: 0.85rem;
639
+ font-weight: 500;
 
 
640
  }
641
 
642
  /* Script Section */
 
690
  color: rgba(255, 255, 255, 0.7);
691
  cursor: pointer;
692
  transition: var(--transition);
693
+ font-size: 0.8rem;
694
  border-bottom: 2px solid transparent;
695
  white-space: nowrap;
696
  }
 
714
 
715
  .script-content pre {
716
  margin: 0;
717
+ font-family: 'Fira Code', 'Courier New', monospace;
718
+ font-size: 0.72rem;
719
  line-height: 1.5;
720
  color: #d4d4d4;
721
  }
722
 
723
+ /* Buttons */
724
+ .btn {
725
+ padding: 0.5rem 1rem;
726
+ border-radius: 8px;
727
+ text-decoration: none;
728
+ font-weight: 500;
729
+ transition: var(--transition);
730
+ border: none;
731
+ cursor: pointer;
732
+ display: inline-flex;
733
+ align-items: center;
734
+ gap: 0.5rem;
735
+ font-size: 0.85rem;
736
+ }
737
+
738
+ .btn-primary {
739
+ background: linear-gradient(135deg, var(--highlight), #ff6b6b);
740
+ color: white;
741
+ }
742
+
743
+ .btn-primary:hover {
744
+ transform: translateY(-2px);
745
+ box-shadow: 0 4px 15px rgba(233, 69, 96, 0.4);
746
+ }
747
+
748
+ .btn-success {
749
+ background: linear-gradient(135deg, var(--fixed), #27ae60);
750
+ color: white;
751
+ }
752
+
753
+ .btn-success:hover {
754
+ transform: translateY(-2px);
755
+ box-shadow: 0 4px 15px rgba(46, 204, 113, 0.4);
756
+ }
757
+
758
+ .btn-secondary {
759
+ background: rgba(255, 255, 255, 0.1);
760
+ color: var(--light);
761
+ border: 1px solid rgba(255, 255, 255, 0.2);
762
+ }
763
+
764
+ .btn-secondary:hover {
765
+ background: rgba(255, 255, 255, 0.2);
766
+ }
767
+
768
  /* Alert Box */
769
  .alert {
770
  padding: 1rem 1.2rem;
 
775
  gap: 0.8rem;
776
  }
777
 
 
 
 
 
 
 
778
  .alert-success {
779
+ background: rgba(46, 204, 113, 0.15);
780
+ border: 1px solid rgba(46, 204, 113, 0.3);
781
+ color: var(--fixed);
782
  }
783
 
784
  .alert-danger {
 
787
  color: var(--danger);
788
  }
789
 
790
+ .alert-warning {
791
+ background: rgba(255, 193, 7, 0.15);
792
+ border: 1px solid rgba(255, 193, 7, 0.3);
793
+ color: var(--warning);
794
+ }
795
+
796
  .alert-info {
797
  background: rgba(23, 162, 184, 0.15);
798
  border: 1px solid rgba(23, 162, 184, 0.3);
799
  color: var(--info);
800
  }
801
 
 
 
 
 
 
 
802
  .alert i {
803
  font-size: 1.2rem;
804
  margin-top: 0.1rem;
 
818
  opacity: 0.9;
819
  }
820
 
821
+ /* Security Score */
822
+ .security-score-container {
823
+ background: linear-gradient(135deg, rgba(26, 26, 46, 0.95) 0%, rgba(22, 33, 62, 0.95) 100%);
824
+ border-radius: var(--radius);
825
+ padding: 2rem;
826
+ margin-bottom: 2rem;
827
+ border: 1px solid rgba(46, 204, 113, 0.3);
828
+ display: grid;
829
+ grid-template-columns: auto 1fr;
830
+ gap: 2rem;
831
+ align-items: center;
832
+ }
833
+
834
+ @media (max-width: 768px) {
835
+ .security-score-container {
836
+ grid-template-columns: 1fr;
837
+ text-align: center;
838
+ }
839
+ }
840
+
841
+ .score-circle {
842
+ width: 140px;
843
+ height: 140px;
844
+ border-radius: 50%;
845
+ background: conic-gradient(var(--fixed) 0deg, var(--fixed) 342deg, rgba(255, 255, 255, 0.1) 342deg);
846
+ display: flex;
847
+ align-items: center;
848
+ justify-content: center;
849
+ position: relative;
850
+ margin: 0 auto;
851
+ }
852
+
853
+ .score-circle::before {
854
+ content: '';
855
+ position: absolute;
856
+ width: 110px;
857
+ height: 110px;
858
+ background: var(--primary);
859
+ border-radius: 50%;
860
+ }
861
+
862
+ .score-value {
863
+ position: relative;
864
+ z-index: 1;
865
+ font-size: 2.2rem;
866
+ font-weight: 700;
867
+ color: var(--fixed);
868
+ }
869
+
870
+ .score-details {
871
+ flex: 1;
872
+ }
873
+
874
+ .score-title {
875
+ font-size: 1.4rem;
876
+ margin-bottom: 0.5rem;
877
+ color: var(--light);
878
+ }
879
+
880
+ .score-subtitle {
881
+ color: rgba(255, 255, 255, 0.7);
882
+ margin-bottom: 1rem;
883
+ font-size: 0.9rem;
884
+ }
885
+
886
+ .score-breakdown {
887
+ display: grid;
888
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
889
+ gap: 0.8rem;
890
+ }
891
+
892
+ .score-item {
893
+ background: rgba(255, 255, 255, 0.05);
894
+ padding: 0.6rem;
895
+ border-radius: 8px;
896
+ text-align: center;
897
+ }
898
+
899
+ .score-item-value {
900
+ font-size: 1.2rem;
901
+ font-weight: 600;
902
+ color: var(--fixed);
903
+ }
904
+
905
+ .score-item-label {
906
+ font-size: 0.7rem;
907
+ color: rgba(255, 255, 255, 0.6);
908
+ text-transform: uppercase;
909
+ }
910
+
911
  /* Checklist */
912
  .checklist {
913
  list-style: none;
 
936
  display: flex;
937
  align-items: center;
938
  justify-content: center;
939
+ font-size: 0.7rem;
940
  flex-shrink: 0;
941
  }
942
 
943
  .checklist-icon.done {
944
+ background: var(--fixed);
 
 
 
 
 
945
  color: white;
946
  }
947
 
948
+ .checklist-icon.fixed {
949
+ background: var(--info);
950
  color: white;
951
  }
952
 
 
957
  .checklist-title {
958
  font-weight: 600;
959
  color: var(--light);
960
+ font-size: 0.85rem;
961
  margin-bottom: 0.2rem;
962
  }
963
 
964
  .checklist-description {
965
  color: rgba(255, 255, 255, 0.6);
966
+ font-size: 0.75rem;
967
  }
968
 
969
+ /* Footer */
970
+ footer {
971
+ background: linear-gradient(135deg, rgba(26, 26, 46, 0.98) 0%, rgba(22, 33, 62, 0.98) 100%);
972
+ padding: 2rem;
973
+ text-align: center;
974
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
 
 
 
 
 
 
 
 
 
 
975
  }
976
 
977
+ .footer-content {
978
+ max-width: 1200px;
979
+ margin: 0 auto;
980
  }
981
 
982
+ .footer-text {
983
+ color: rgba(255, 255, 255, 0.7);
984
+ font-size: 0.85rem;
985
+ margin-bottom: 0.5rem;
 
 
 
 
 
 
 
 
986
  }
987
 
988
+ .footer-links {
989
+ display: flex;
990
+ justify-content: center;
991
+ gap: 1.5rem;
992
+ flex-wrap: wrap;
993
  }
994
 
995
+ .footer-links a {
996
+ color: var(--highlight);
997
+ text-decoration: none;
998
+ font-size: 0.85rem;
999
+ transition: var(--transition);
 
 
1000
  }
1001
 
1002
+ .footer-links a:hover {
1003
+ text-decoration: underline;
 
 
1004
  }
1005
 
1006
+ /* Responsive */
1007
+ @media (max-width: 768px) {
1008
+ header {
1009
+ padding: 1rem;
1010
+ }
1011
+
1012
+ .header-content {
1013
+ flex-direction: column;
1014
+ align-items: flex-start;
1015
+ }
1016
+
1017
+ .logo {
1018
+ font-size: 1.2rem;
1019
+ }
1020
+
1021
+ nav ul {
1022
+ width: 100%;
1023
+ justify-content: flex-start;
1024
+ }
1025
+
1026
+ main {
1027
+ padding: 0 1rem;
1028
+ }
1029
+
1030
+ .section-title-main {
1031
+ font-size: 1.3rem;
1032
+ }
1033
+
1034
+ .dashboard-grid {
1035
+ grid-template-columns: 1fr;
1036
+ }
1037
+ }
1038
+
1039
+ /* Copy Button */
1040
+ .copy-btn {
1041
+ position: absolute;
1042
+ top: 0.5rem;
1043
+ right: 0.5rem;
1044
+ background: rgba(255, 255, 255, 0.1);
1045
  border: none;
 
1046
  color: rgba(255, 255, 255, 0.7);
1047
+ padding: 0.4rem 0.6rem;
1048
+ border-radius: 4px;
1049
  cursor: pointer;
1050
+ font-size: 0.7rem;
1051
  transition: var(--transition);
 
1052
  }
1053
 
1054
+ .copy-btn:hover {
1055
+ background: rgba(255, 255, 255, 0.2);
1056
+ color: var(--light);
1057
  }
1058
 
1059
+ .copy-btn.copied {
1060
+ background: var(--fixed);
1061
+ color: white;
1062
  }
1063
 
1064
+ /* Entropy Visualization */
1065
+ .entropy-visual {
1066
+ display: flex;
1067
+ gap: 2px;
1068
+ margin: 1rem 0;
1069
+ flex-wrap: wrap;
1070
  }
1071
 
1072
+ .entropy-block {
1073
+ width: 8px;
1074
+ height: 20px;
1075
+ border-radius: 2px;
1076
+ transition: var(--transition);
1077
  }
1078
 
1079
+ .entropy-block.high {
1080
+ background: var(--fixed);
 
 
1081
  }
1082
 
1083
+ .entropy-block.medium {
1084
+ background: var(--warning);
 
1085
  }
1086
 
1087
+ .entropy-block.low {
1088
+ background: var(--danger);
1089
  }
1090
+ </style>
1091
+ </head>
1092
+
1093
+ <body>
1094
+ <header>
1095
+ <div class="header-content">
1096
+ <div class="logo-container">
1097
+ <a href="#" class="logo">
1098
+ <span class="logo-icon"><i class="fas fa-shield-halved"></i></span>
1099
+ Gemma 3 Hardened Container
1100
+ </a>
1101
+ <span class="model-badge">gemma-3-12b-it-abliterated-v2.q4_k_m.gguf</span>
1102
+ <span class="version-badge"><i class="fas fa-wrench"></i> v2.0 - Critical Fixes</span>
1103
+ <span class="fixes-badge"><i class="fas fa-bug"></i> 3 Flaws Resolved</span>
1104
+ </div>
1105
+ <div class="built-with">
1106
+ <span>Built with</span>
1107
+ <a href="https://huggingface.co/spaces/akhaliq/anycoder" target="_blank">anycoder</a>
1108
+ </div>
1109
+ </div>
1110
+ <nav>
1111
+ <ul>
1112
+ <li><a href="#fixes"><i class="fas fa-tools"></i> Critical Fixes</a></li>
1113
+ <li><a href="#implementation"><i class="fas fa-code"></i> Implementation</a></li>
1114
+ <li><a href="#scripts"><i class="fas fa-terminal"></i> Scripts</a></li>
1115
+ <li><a href="#verification"><i class="fas fa-check-double"></i> Verification</a></li>
1116
+ </ul>
1117
+ </nav>
1118
+ </header>
1119
+
1120
+ <main>
1121
+ <!-- Critical Fixes Banner -->
1122
+ <section class="critical-fixes-banner" id="fixes">
1123
+ <div class="banner-header">
1124
+ <div class="banner-icon">
1125
+ <i class="fas fa-exclamation-triangle"></i>
1126
+ </div>
1127
+ <div>
1128
+ <h2 class="banner-title">Critical Implementation Flaws - RESOLVED</h2>
1129
+ <p class="banner-subtitle">All identified security and functionality issues have been addressed in this version</p>
1130
+ </div>
1131
+ </div>
1132
+ <div class="fixes-summary">
1133
+ <div class="fix-item">
1134
+ <div class="fix-status fixed"><i class="fas fa-check"></i></div>
1135
+ <div class="fix-content">
1136
+ <h4>Logging Paradox (DoS Fix)</h4>
1137
+ <p>Removed FileHandler, now using stdout/stderr with Docker log driver</p>
1138
+ </div>
1139
+ </div>
1140
+ <div class="fix-item">
1141
+ <div class="fix-status fixed"><i class="fas fa-check"></i></div>
1142
+ <div class="fix-content">
1143
+ <h4>Remount Fallacy Removed</h4>
1144
+ <p>Eliminated privileged mount command that would fail without CAP_SYS_ADMIN</p>
1145
+ </div>
1146
+ </div>
1147
+ <div class="fix-item">
1148
+ <div class="fix-status fixed"><i class="fas fa-check"></i></div>
1149
+ <div class="fix-content">
1150
+ <h4>Entropy Source Hardened</h4>
1151
+ <p>Added hardware RNG verification and /dev/random blocking for crypto operations</p>
1152
+ </div>
1153
+ </div>
1154
+ </div>
1155
+ </section>
1156
+
1157
+ <!-- Security Score -->
1158
+ <section class="security-score-container">
1159
+ <div class="score-circle">
1160
+ <span class="score-value">95%</span>
1161
+ </div>
1162
+ <div class="score-details">
1163
+ <h2 class="score-title">Security Posture Score - Post-Fix</h2>
1164
+ <p class="score-subtitle">All critical implementation flaws resolved. Container now production-ready.</p>
1165
+ <div class="score-breakdown">
1166
+ <div class="score-item">
1167
+ <div class="score-item-value">✓</div>
1168
+ <div class="score-item-label">Logging Fixed</div>
1169
+ </div>
1170
+ <div class="score-item">
1171
+ <div class="score-item-value">✓</div>
1172
+ <div class="score-item-label">RO Filesystem</div>
1173
+ </div>
1174
+ <div class="score-item">
1175
+ <div class="score-item-value">✓</div>
1176
+ <div class="score-item-label">Entropy Secure</div>
1177
+ </div>
1178
+ <div class="score-item">
1179
+ <div class="score-item-value">✓</div>
1180
+ <div class="score