fix: D3FEND ontology-based import, template management UX, and branding
- Rewrite D3FEND import to use tactic-level APIs for reliable technique fetching with proper ontology IRIs, descriptions, and tactic assignments - Fix D3FEND technique URLs to use canonical IRI (no more 404s) - All 255 D3FEND techniques now have descriptions from the official API - Change Deactivate button color to red in template management table - Add custom Aegis logo and favicon replacing default Vite assets - Remove unused old API parsing code and clean up fallback list
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Aegis — MITRE ATT&CK Coverage</title>
|
||||
</head>
|
||||
|
||||
70
frontend/public/aegis-logo.svg
Normal file
70
frontend/public/aegis-logo.svg
Normal file
@@ -0,0 +1,70 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="none">
|
||||
<defs>
|
||||
<linearGradient id="shieldGrad" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0%" stop-color="#06b6d4"/>
|
||||
<stop offset="100%" stop-color="#0e7490"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="innerGrad" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#22d3ee" stop-opacity="0.25"/>
|
||||
<stop offset="100%" stop-color="#06b6d4" stop-opacity="0.05"/>
|
||||
</linearGradient>
|
||||
<filter id="glow">
|
||||
<feGaussianBlur stdDeviation="6" result="blur"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="blur"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
</defs>
|
||||
|
||||
<!-- Shield body -->
|
||||
<path
|
||||
d="M256 28 L462 108 C462 108 472 300 256 484 C40 300 50 108 50 108 Z"
|
||||
fill="url(#shieldGrad)"
|
||||
stroke="#22d3ee"
|
||||
stroke-width="6"
|
||||
filter="url(#glow)"
|
||||
/>
|
||||
|
||||
<!-- Inner shield -->
|
||||
<path
|
||||
d="M256 64 L428 130 C428 130 436 290 256 448 C76 290 84 130 84 130 Z"
|
||||
fill="url(#innerGrad)"
|
||||
stroke="#22d3ee"
|
||||
stroke-width="2"
|
||||
stroke-opacity="0.3"
|
||||
/>
|
||||
|
||||
<!-- Circuit lines (left) -->
|
||||
<g stroke="#0f172a" stroke-width="3" stroke-opacity="0.4">
|
||||
<line x1="140" y1="200" x2="200" y2="200"/>
|
||||
<line x1="140" y1="200" x2="140" y2="260"/>
|
||||
<circle cx="140" cy="200" r="4" fill="#0f172a" fill-opacity="0.4"/>
|
||||
<line x1="160" y1="280" x2="200" y2="280"/>
|
||||
<circle cx="160" cy="280" r="4" fill="#0f172a" fill-opacity="0.4"/>
|
||||
</g>
|
||||
|
||||
<!-- Circuit lines (right) -->
|
||||
<g stroke="#0f172a" stroke-width="3" stroke-opacity="0.4">
|
||||
<line x1="372" y1="200" x2="312" y2="200"/>
|
||||
<line x1="372" y1="200" x2="372" y2="260"/>
|
||||
<circle cx="372" cy="200" r="4" fill="#0f172a" fill-opacity="0.4"/>
|
||||
<line x1="352" y1="280" x2="312" y2="280"/>
|
||||
<circle cx="352" cy="280" r="4" fill="#0f172a" fill-opacity="0.4"/>
|
||||
</g>
|
||||
|
||||
<!-- Central "A" letterform -->
|
||||
<g filter="url(#glow)">
|
||||
<path
|
||||
d="M256 140 L312 320 L292 320 L278 276 L234 276 L220 320 L200 320 Z
|
||||
M240 256 L272 256 L256 192 Z"
|
||||
fill="#0f172a"
|
||||
fill-opacity="0.85"
|
||||
/>
|
||||
</g>
|
||||
|
||||
<!-- Lock/keyhole at bottom of A -->
|
||||
<circle cx="256" cy="350" r="22" fill="#0f172a" fill-opacity="0.7" stroke="#22d3ee" stroke-width="2" stroke-opacity="0.5"/>
|
||||
<circle cx="256" cy="345" r="8" fill="#22d3ee" fill-opacity="0.8"/>
|
||||
<rect x="252" y="348" width="8" height="14" rx="2" fill="#22d3ee" fill-opacity="0.8"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.4 KiB |
18
frontend/public/favicon.svg
Normal file
18
frontend/public/favicon.svg
Normal file
@@ -0,0 +1,18 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" fill="none">
|
||||
<defs>
|
||||
<linearGradient id="sg" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0%" stop-color="#06b6d4"/>
|
||||
<stop offset="100%" stop-color="#0e7490"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<!-- Shield -->
|
||||
<path d="M32 3 L58 13 C58 13 60 38 32 61 C4 38 6 13 6 13 Z" fill="url(#sg)" stroke="#22d3ee" stroke-width="1.5"/>
|
||||
<!-- Inner fill -->
|
||||
<path d="M32 8 L53 16 C53 16 55 36 32 56 C9 36 11 16 11 16 Z" fill="#0f172a" fill-opacity="0.3"/>
|
||||
<!-- A letter -->
|
||||
<path d="M32 16 L41 42 L37 42 L35 35 L29 35 L27 42 L23 42 Z M30 32 L34 32 L32 23 Z" fill="#0f172a" fill-opacity="0.9"/>
|
||||
<!-- Lock dot -->
|
||||
<circle cx="32" cy="46" r="3" fill="#0f172a" fill-opacity="0.7" stroke="#22d3ee" stroke-width="0.5"/>
|
||||
<circle cx="32" cy="45.5" r="1.2" fill="#22d3ee"/>
|
||||
<rect x="31.2" y="46" width="1.6" height="2.5" rx="0.5" fill="#22d3ee"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 924 B |
@@ -2,7 +2,6 @@ import { NavLink } from "react-router-dom";
|
||||
import { useState } from "react";
|
||||
import {
|
||||
LayoutDashboard,
|
||||
Shield,
|
||||
FlaskConical,
|
||||
BookOpen,
|
||||
BarChart3,
|
||||
@@ -132,8 +131,8 @@ export default function Sidebar() {
|
||||
return (
|
||||
<aside className="flex h-screen w-60 flex-col border-r border-gray-800 bg-gray-900">
|
||||
{/* Logo */}
|
||||
<div className="flex h-16 items-center gap-2 px-5">
|
||||
<Shield className="h-7 w-7 text-cyan-400" />
|
||||
<div className="flex h-16 items-center gap-3 px-5">
|
||||
<img src="/aegis-logo.svg" alt="Aegis" className="h-8 w-8" />
|
||||
<span className="text-lg font-bold tracking-wide text-white">
|
||||
Aegis
|
||||
</span>
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import { useState, type FormEvent } from "react";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
import { Shield } from "lucide-react";
|
||||
import { useAuth } from "../context/AuthContext";
|
||||
|
||||
export default function LoginPage() {
|
||||
@@ -37,8 +36,8 @@ export default function LoginPage() {
|
||||
<div className="flex min-h-screen items-center justify-center bg-gray-950 px-4">
|
||||
<div className="w-full max-w-sm space-y-8">
|
||||
{/* Logo */}
|
||||
<div className="flex flex-col items-center gap-2">
|
||||
<Shield className="h-12 w-12 text-cyan-400" />
|
||||
<div className="flex flex-col items-center gap-3">
|
||||
<img src="/aegis-logo.svg" alt="Aegis" className="h-16 w-16" />
|
||||
<h1 className="text-2xl font-bold tracking-wide text-white">
|
||||
Aegis
|
||||
</h1>
|
||||
|
||||
@@ -516,7 +516,7 @@ export default function SystemPage() {
|
||||
disabled={toggleActiveMutation.isPending}
|
||||
className={`flex items-center gap-1 text-xs font-medium transition-colors ${
|
||||
tpl.is_active
|
||||
? "text-yellow-400 hover:text-yellow-300"
|
||||
? "text-red-400 hover:text-red-300"
|
||||
: "text-green-400 hover:text-green-300"
|
||||
}`}
|
||||
title={tpl.is_active ? "Deactivate" : "Activate"}
|
||||
|
||||
Reference in New Issue
Block a user