larxius commited on
Commit
b51247d
·
verified ·
1 Parent(s): 0f4790c

Update frontend/src/components/FeatureComparison.jsx

Browse files
frontend/src/components/FeatureComparison.jsx ADDED
@@ -0,0 +1,283 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react';
2
+
3
+ const CheckIcon = () => (
4
+ <div className="w-6 h-6 rounded-full bg-emerald-500 text-white flex items-center justify-center shadow-sm mx-auto">
5
+ <svg className="w-4 h-4 stroke-[3]" fill="none" viewBox="0 0 24 24" stroke="currentColor">
6
+ <path strokeLinecap="round" strokeLinejoin="round" d="M5 13l4 4L19 7" />
7
+ </svg>
8
+ </div>
9
+ );
10
+
11
+ const CrossIcon = () => (
12
+ <div className="w-6 h-6 rounded-full bg-red-100 text-red-500 flex items-center justify-center mx-auto">
13
+ <svg className="w-3.5 h-3.5 stroke-[2.5]" fill="none" viewBox="0 0 24 24" stroke="currentColor">
14
+ <path strokeLinecap="round" strokeLinejoin="round" d="M6 18L18 6M6 6l12 12" />
15
+ </svg>
16
+ </div>
17
+ );
18
+
19
+ const HalfIcon = ({ label }) => (
20
+ <div className="flex items-center justify-center gap-1.5 mx-auto">
21
+ <div className="w-5 h-5 rounded-full border-2 border-slate-700 relative overflow-hidden flex items-center justify-start bg-slate-100 shrink-0">
22
+ <div className="w-1/2 h-full bg-slate-800"></div>
23
+ </div>
24
+ {label && <span className="text-[12px] text-on-surface-variant font-medium">({label})</span>}
25
+ </div>
26
+ );
27
+
28
+ export const FeatureComparison = () => {
29
+ const comparisonData = [
30
+ {
31
+ feature: "Real-Time Vulnerability Scanning",
32
+ larshield: "check",
33
+ nessus: "cross",
34
+ openvas: "cross",
35
+ qualys: "cross",
36
+ },
37
+ {
38
+ feature: "Zero-Day Threat Intelligence",
39
+ larshield: "check",
40
+ nessus: "cross",
41
+ openvas: "cross",
42
+ qualys: "half",
43
+ qualysLabel: "Limited",
44
+ },
45
+ {
46
+ feature: "Automated Risk Prioritization (AI)",
47
+ larshield: "check",
48
+ nessus: "half",
49
+ nessusLabel: "Basic",
50
+ openvas: "cross",
51
+ qualys: "check",
52
+ },
53
+ {
54
+ feature: "Web Application Scanning (OWASP Top 10)",
55
+ larshield: "check",
56
+ nessus: "check",
57
+ openvas: "check",
58
+ qualys: "check",
59
+ },
60
+ {
61
+ feature: "API Security Scanning",
62
+ larshield: "check",
63
+ nessus: "cross",
64
+ openvas: "cross",
65
+ qualys: "check",
66
+ },
67
+ {
68
+ feature: "Cloud Security Scanning (AWS, Azure, GCP)",
69
+ larshield: "check",
70
+ nessus: "cross",
71
+ openvas: "cross",
72
+ qualys: "check",
73
+ },
74
+ {
75
+ feature: "Network & Port Scanning",
76
+ larshield: "check",
77
+ nessus: "check",
78
+ openvas: "check",
79
+ qualys: "check",
80
+ },
81
+ {
82
+ feature: "Asset Discovery & Inventory",
83
+ larshield: "check",
84
+ nessus: "check",
85
+ openvas: "check",
86
+ qualys: "check",
87
+ },
88
+ {
89
+ feature: "Real-Time Alerts & Notifications",
90
+ larshield: "check",
91
+ nessus: "cross",
92
+ openvas: "cross",
93
+ qualys: "check",
94
+ },
95
+ {
96
+ feature: "Automated Compliance Reporting",
97
+ larshield: "check",
98
+ nessus: "half",
99
+ nessusLabel: "Limited",
100
+ openvas: "cross",
101
+ qualys: "check",
102
+ },
103
+ {
104
+ feature: "Unified Dashboard",
105
+ larshield: "check",
106
+ nessus: "cross",
107
+ openvas: "cross",
108
+ qualys: "check",
109
+ },
110
+ {
111
+ feature: "Customizable & Flexible Scans",
112
+ larshield: "check",
113
+ nessus: "check",
114
+ openvas: "check",
115
+ qualys: "check",
116
+ },
117
+ {
118
+ feature: "Easy Deployment & Management",
119
+ larshield: "check",
120
+ nessus: "cross",
121
+ openvas: "cross",
122
+ qualys: "check",
123
+ },
124
+ {
125
+ feature: "Affordable & Scalable for Businesses",
126
+ larshield: "check",
127
+ nessus: "cross",
128
+ openvas: "check",
129
+ qualys: "cross",
130
+ },
131
+ ];
132
+
133
+ const renderCell = (type, label) => {
134
+ if (type === "check") return <CheckIcon />;
135
+ if (type === "cross") return <CrossIcon />;
136
+ if (type === "half") return <HalfIcon label={label} />;
137
+ return null;
138
+ };
139
+
140
+ return (
141
+ <section id="comparison" className="py-xl md:py-2xl bg-surface relative border-t border-outline-variant/50">
142
+ <div className="max-w-container-max mx-auto px-gutter">
143
+
144
+ {/* Section Header */}
145
+ <div className="text-center mb-xl">
146
+ <span className="bg-primary/10 text-primary font-bold px-sm py-[4px] rounded-full text-[12px] uppercase tracking-wider mb-xs border border-primary/20 inline-block">
147
+ Competitive Advantage
148
+ </span>
149
+ <h2 className="font-headline-lg text-[28px] md:text-[36px] font-extrabold text-on-surface mb-xs tracking-tight">
150
+ How LarShield Compares
151
+ </h2>
152
+ <p className="font-body-md text-on-surface-variant max-w-[680px] mx-auto text-[15px] leading-relaxed">
153
+ See why modern engineering and security teams choose LarShield over legacy vulnerability scanners.
154
+ </p>
155
+ </div>
156
+
157
+ {/* Table Container */}
158
+ <div className="bg-surface-container-lowest border border-outline-variant/80 rounded-2xl shadow-xl overflow-hidden">
159
+ <div className="overflow-x-auto custom-scrollbar">
160
+ <table className="w-full text-left border-collapse min-w-[760px]">
161
+
162
+ {/* Header Row */}
163
+ <thead>
164
+ <tr className="border-b border-outline-variant/80">
165
+ <th className="py-md px-lg bg-[#0B0C10] text-white font-bold text-[15px] w-[30%]">
166
+ Feature
167
+ </th>
168
+
169
+ {/* LarShield Column Header */}
170
+ <th className="py-md px-md bg-gradient-to-b from-blue-600 to-blue-700 text-white font-bold text-[16px] text-center w-[20%] relative shadow-md">
171
+ <div className="flex items-center justify-center gap-2">
172
+ <div className="w-7 h-7 rounded-lg bg-white/10 p-1 flex items-center justify-center border border-white/20">
173
+ <img src="/logo.png" alt="LarShield" className="w-full h-full object-contain" />
174
+ </div>
175
+ <span className="tracking-tight font-display font-extrabold text-[17px] text-white">LarShield</span>
176
+ </div>
177
+ </th>
178
+
179
+ {/* Nessus */}
180
+ <th className="py-md px-md bg-[#0B0C10] text-white font-bold text-[15px] text-center w-[16.66%]">
181
+ <div className="flex items-center justify-center gap-2">
182
+ <div className="w-6 h-6 rounded-full bg-emerald-600 text-white font-black text-[12px] flex items-center justify-center shadow-inner">
183
+ N
184
+ </div>
185
+ <span className="font-bold">Nessus</span>
186
+ </div>
187
+ </th>
188
+
189
+ {/* OpenVAS */}
190
+ <th className="py-md px-md bg-[#0B0C10] text-white font-bold text-[15px] text-center w-[16.66%]">
191
+ <div className="flex items-center justify-center gap-2">
192
+ <div className="w-6 h-6 rounded-full bg-emerald-500/20 text-emerald-400 border border-emerald-500/40 flex items-center justify-center">
193
+ <span className="material-symbols-outlined text-[15px]">bug_report</span>
194
+ </div>
195
+ <span className="font-bold">OpenVAS</span>
196
+ </div>
197
+ </th>
198
+
199
+ {/* Qualys */}
200
+ <th className="py-md px-md bg-[#0B0C10] text-white font-bold text-[15px] text-center w-[16.66%]">
201
+ <div className="flex items-center justify-center gap-2">
202
+ <div className="w-6 h-6 rounded-full bg-red-600 text-white font-bold text-[12px] flex items-center justify-center shadow-inner">
203
+ Q
204
+ </div>
205
+ <span className="font-bold">Qualys</span>
206
+ </div>
207
+ </th>
208
+ </tr>
209
+ </thead>
210
+
211
+ {/* Table Body */}
212
+ <tbody className="divide-y divide-outline-variant/40 text-[14px]">
213
+ {comparisonData.map((row, idx) => (
214
+ <tr
215
+ key={idx}
216
+ className={`${idx % 2 === 0 ? 'bg-surface-container-lowest' : 'bg-surface/40'} hover:bg-surface-container-low/80 transition-colors`}
217
+ >
218
+ {/* Feature Name */}
219
+ <td className="py-3.5 px-lg font-semibold text-on-surface">
220
+ {row.feature}
221
+ </td>
222
+
223
+ {/* LarShield Cell (Highlighted Column) */}
224
+ <td className="py-3.5 px-md text-center bg-blue-50/70 border-x border-blue-100 font-bold">
225
+ {renderCell(row.larshield)}
226
+ </td>
227
+
228
+ {/* Nessus Cell */}
229
+ <td className="py-3.5 px-md text-center">
230
+ {renderCell(row.nessus, row.nessusLabel)}
231
+ </td>
232
+
233
+ {/* OpenVAS Cell */}
234
+ <td className="py-3.5 px-md text-center">
235
+ {renderCell(row.openvas, row.openvasLabel)}
236
+ </td>
237
+
238
+ {/* Qualys Cell */}
239
+ <td className="py-3.5 px-md text-center">
240
+ {renderCell(row.qualys, row.qualysLabel)}
241
+ </td>
242
+ </tr>
243
+ ))}
244
+
245
+ {/* Pricing Row */}
246
+ <tr className="bg-surface-container-low font-bold border-t-2 border-outline-variant/60">
247
+ <td className="py-4 px-lg text-on-surface text-[15px]">
248
+ Pricing
249
+ </td>
250
+
251
+ {/* LarShield Pricing */}
252
+ <td className="py-4 px-md text-center bg-blue-100/60 border-x border-blue-200 text-primary text-[14.5px] font-extrabold">
253
+ Flexible &amp; Affordable
254
+ </td>
255
+
256
+ {/* Nessus Pricing */}
257
+ <td className="py-4 px-md text-center text-on-surface-variant font-medium">
258
+ Subscription
259
+ </td>
260
+
261
+ {/* OpenVAS Pricing */}
262
+ <td className="py-4 px-md text-center text-on-surface-variant font-medium">
263
+ Free <br className="sm:hidden" />
264
+ <span className="text-[12px] opacity-80">(Open Source)</span>
265
+ </td>
266
+
267
+ {/* Qualys Pricing */}
268
+ <td className="py-4 px-md text-center text-on-surface-variant font-medium">
269
+ Subscription
270
+ </td>
271
+ </tr>
272
+ </tbody>
273
+
274
+ </table>
275
+ </div>
276
+ </div>
277
+
278
+ </div>
279
+ </section>
280
+ );
281
+ };
282
+
283
+ export default FeatureComparison;