@@ -14,7 +14,7 @@ const featureList = [
1414 {
1515 title : 'Connectivity controls' ,
1616 body : 'Shut down Wi-Fi, hotspots, Bluetooth sharing, and MMS when zero side channels are allowed.' ,
17- icon : 'fa-solid fa-wifi-slash ' ,
17+ icon : 'fa-solid fa-tower-broadcast ' ,
1818 } ,
1919 {
2020 title : 'Web filtering' ,
@@ -51,6 +51,12 @@ const faqs = [
5151 } ,
5252] ;
5353
54+ const slowVideoPlayback = ( event ) => {
55+ if ( event ?. currentTarget ) {
56+ event . currentTarget . playbackRate = 0.8 ;
57+ }
58+ } ;
59+
5460export default function EGate ( ) {
5561 return (
5662 < div className = "bg-black" >
@@ -115,20 +121,10 @@ function Hero() {
115121 Learn more < i className = "fa-solid fa-arrow-up-right-from-square text-xs" />
116122 </ a >
117123 </ div >
118- < div className = "flex flex-wrap gap-8 rounded-3xl border border-white/10 bg-white/5 px-6 py-4 text-sm text-slate-200 sm:text-base" >
119- < div >
120- < p className = "text-2xl font-semibold text-white" > 0</ p >
121- < p className = "text-xs uppercase tracking-[0.3em] text-slate-400" > Escalations</ p >
122- </ div >
123- < div >
124- < p className = "text-2xl font-semibold text-white" > 97%</ p >
125- < p className = "text-xs uppercase tracking-[0.3em] text-slate-400" > Satisfaction</ p >
126- </ div >
127- < div >
128- < p className = "text-2xl font-semibold text-white" > Q4 build</ p >
129- < p className = "text-xs uppercase tracking-[0.3em] text-slate-400" > Pixel 8a</ p >
130- </ div >
131- </ div >
124+ < p className = "rounded-3xl border border-white/10 bg-white/5 px-6 py-4 text-sm text-slate-200 sm:text-base" >
125+ Built and maintained by < span className = "font-semibold text-white" > Offline Software Solutions</ span > so our kosher deployments always
126+ inherit the hardened stack from the original .io launch.
127+ </ p >
132128 </ div >
133129 < div className = "flex justify-center lg:justify-end" >
134130 < PhoneMock />
@@ -167,12 +163,14 @@ function PhoneMock() {
167163 < foreignObject x = "45" y = "60" width = "190" height = "270" clipPath = "url(#egate-phone-screen)" >
168164 < video
169165 src = "/img/qinf21.mp4"
170- className = "h-full w-full rounded-3xl object-contain"
166+ className = "h-full w-full rounded-3xl object-contain bg-black "
171167 autoPlay
172168 loop
173169 muted
174170 playsInline
175171 aria-label = "eGate demo"
172+ onLoadedData = { slowVideoPlayback }
173+ style = { { transform : 'scale(0.92)' } }
176174 />
177175 </ foreignObject >
178176 < rect x = "120" y = "25" width = "40" height = "6" rx = "3" fill = "#555555" />
@@ -217,15 +215,19 @@ function Highlights() {
217215 </ p >
218216 </ div >
219217 < div className = "relative mx-auto flex w-full max-w-sm flex-1 items-center justify-center px-8 pb-10 pt-8 lg:max-w-full" >
220- < div className = "h-[22rem] w-full max-w-md rounded-[2rem] border border-white/10 bg-gradient-to-b from-slate-900 to-black p-4 shadow-2xl" >
221- < video
222- src = "/img/qinf21.mp4"
223- className = "h-full w-full rounded-[1.5rem] object-cover"
224- autoPlay
225- loop
226- muted
227- playsInline
228- />
218+ < div className = "h-[22rem] w-full max-w-md rounded-[2rem] border border-white/10 bg-gradient-to-b from-slate-950 to-slate-900 p-4 shadow-2xl" >
219+ < div className = "flex h-full w-full items-center justify-center rounded-[1.5rem] bg-black/70 p-4" >
220+ < video
221+ src = "/img/qinf21.mp4"
222+ className = "h-full w-full rounded-2xl object-contain"
223+ autoPlay
224+ loop
225+ muted
226+ playsInline
227+ onLoadedData = { slowVideoPlayback }
228+ style = { { transform : 'scale(0.92)' } }
229+ />
230+ </ div >
229231 </ div >
230232 </ div >
231233 </ CardChrome >
@@ -238,7 +240,7 @@ function Highlights() {
238240 < p className = "mt-3 text-sm text-slate-300" > Locked by credentials you control—no unauthorized toggles.</ p >
239241 </ div >
240242 < div className = "flex flex-1 items-center justify-center px-8 pb-10 pt-6" >
241- < img src = "/img/home/pwd.png" alt = "Password UI" className = "h-40 w-auto object-contain" />
243+ < PasswordBadge />
242244 </ div >
243245 </ CardChrome >
244246 </ article >
@@ -250,7 +252,7 @@ function Highlights() {
250252 < p className = "mt-3 text-sm text-slate-300" > Rapid release cadence keeps policies and tooling modern.</ p >
251253 </ div >
252254 < div className = "flex flex-1 items-center justify-center px-8 pb-10 pt-6" >
253- < img src = "/img/home/lines.png" alt = "Update timeline" className = "w-full max-w-xs object-contain" />
255+ < ProgressiveGraphic />
254256 </ div >
255257 </ CardChrome >
256258 </ article >
@@ -284,6 +286,66 @@ function CardChrome({ children, className = '' }) {
284286 ) ;
285287}
286288
289+ function PasswordBadge ( ) {
290+ return (
291+ < div className = "relative w-full max-w-xs rounded-[1.75rem] border border-white/10 bg-gradient-to-br from-slate-950 via-slate-900 to-sky-900 p-6 text-center text-white shadow-xl" >
292+ < div className = "mx-auto flex h-16 w-16 items-center justify-center rounded-2xl bg-sky-500/20 text-3xl text-sky-200" >
293+ < i className = "fa-solid fa-lock" > </ i >
294+ </ div >
295+ < p className = "mt-4 text-lg font-semibold" > Password enforced</ p >
296+ < p className = "mt-1 text-xs uppercase tracking-[0.4em] text-slate-400" > offline key</ p >
297+ < div className = "mt-5 space-y-2 text-left text-xs text-slate-200/80" >
298+ < p className = "flex items-center gap-2" >
299+ < span className = "h-1.5 w-1.5 rounded-full bg-emerald-400" />
300+ Local device PIN protection
301+ </ p >
302+ < p className = "flex items-center gap-2" >
303+ < span className = "h-1.5 w-1.5 rounded-full bg-sky-400" />
304+ Admin-only override portal
305+ </ p >
306+ < p className = "flex items-center gap-2" >
307+ < span className = "h-1.5 w-1.5 rounded-full bg-indigo-400" />
308+ Logged policy revisions
309+ </ p >
310+ </ div >
311+ </ div >
312+ ) ;
313+ }
314+
315+ function ProgressiveGraphic ( ) {
316+ return (
317+ < svg viewBox = "0 0 320 200" className = "w-full max-w-xs" role = "img" >
318+ < defs >
319+ < linearGradient id = "egate-pulse" x1 = "0%" y1 = "0%" x2 = "100%" y2 = "0%" >
320+ < stop offset = "0%" stopColor = "#38bdf8" />
321+ < stop offset = "50%" stopColor = "#6366f1" />
322+ < stop offset = "100%" stopColor = "#f472b6" />
323+ </ linearGradient >
324+ </ defs >
325+ < rect width = "320" height = "200" rx = "28" fill = "url(#egate-pulse)" opacity = "0.15" />
326+ < g fill = "none" strokeWidth = "3" strokeLinecap = "round" >
327+ < path
328+ d = "M20 130 Q 60 40, 100 90 T 180 80 T 260 30"
329+ stroke = "url(#egate-pulse)"
330+ opacity = "0.8"
331+ />
332+ < path d = "M20 150 Q 60 70, 120 120 T 200 90 T 300 120" stroke = "#1d4ed8" opacity = "0.4" />
333+ </ g >
334+ < g fill = "white" opacity = "0.9" >
335+ < circle cx = "100" cy = "90" r = "6" />
336+ < circle cx = "180" cy = "80" r = "6" />
337+ < circle cx = "260" cy = "30" r = "6" />
338+ </ g >
339+ < text x = "24" y = "40" fill = "white" fontSize = "16" fontWeight = "600" >
340+ Progressive timeline
341+ </ text >
342+ < text x = "24" y = "64" fill = "#cbd5f5" fontSize = "12" >
343+ Weekly policy drops
344+ </ text >
345+ </ svg >
346+ ) ;
347+ }
348+
287349function FaqSection ( ) {
288350 return (
289351 < section className = "bg-slate-950/80 py-20" >
0 commit comments