Ryan Christian D. Deniega commited on
Commit
41972d7
·
1 Parent(s): f7e9353

feat: landing page UX improvements — mock result card, crosshatch hero, teaser centering, nav home link

Browse files
.firebase/hosting.ZnJvbnRlbmQvZGlzdA.cache CHANGED
@@ -1,5 +1,5 @@
1
- vite.svg,1772007250601,d3bbbc44b3ea71906a72bf2ec1a4716903e2e3d9f85a5007205a65d1f12e2923
2
- logo.svg,1772007250601,c1ca19989c26d83c632b01609dc4514e16bef7418284c6df88b29ac34ca035ec
3
- index.html,1772007250792,4c51726f347b368d44d30afacc29469f6610be348d29aca35316322116d1f636
4
- assets/index-DE8XF5VL.css,1772007250792,941148112bdd25f98beea529b6ad97209f2f777e70671d0f5b96f919c8472699
5
- assets/index-pa_ZGMTy.js,1772007250792,181110f569f8d340b4f682558d7e44c1e93acc89a281c426b91a85cba26620d6
 
1
+ vite.svg,1772521195595,d3bbbc44b3ea71906a72bf2ec1a4716903e2e3d9f85a5007205a65d1f12e2923
2
+ logo.svg,1772521195594,c1ca19989c26d83c632b01609dc4514e16bef7418284c6df88b29ac34ca035ec
3
+ index.html,1772521195805,f4ea204f361356008527b286338d4e535c91f1c2db164fc2d9fec57785eaf5a8
4
+ assets/index-Dt10NNY1.css,1772521195805,df3c475242239a40c6fe5ffde99a413911fed9d3f66fd3b347cc7c6b0d389234
5
+ assets/index-DV-sQJ3V.js,1772521195805,5e09c1588564da126e33bdc6d9c0e99abe241831c06d5a93755b975b2e651c5c
frontend/.env.production ADDED
@@ -0,0 +1 @@
 
 
1
+ VITE_API_BASE_URL=https://semiautomat1c-philverify-api.hf.space/api
frontend/src/components/Navbar.jsx CHANGED
@@ -1,8 +1,9 @@
1
  import { NavLink, Link } from 'react-router-dom'
2
- import { Radar, Clock, TrendingUp, ShieldCheck } from 'lucide-react'
3
  import { PAGE_STYLE } from '../App.jsx'
4
 
5
  const NAV_LINKS = [
 
6
  { to: '/verify', icon: ShieldCheck, label: 'Verify' },
7
  { to: '/history', icon: Clock, label: 'History' },
8
  { to: '/trends', icon: TrendingUp, label: 'Trends' },
 
1
  import { NavLink, Link } from 'react-router-dom'
2
+ import { Radar, Clock, TrendingUp, ShieldCheck, Home } from 'lucide-react'
3
  import { PAGE_STYLE } from '../App.jsx'
4
 
5
  const NAV_LINKS = [
6
+ { to: '/', icon: Home, label: 'Home' },
7
  { to: '/verify', icon: ShieldCheck, label: 'Verify' },
8
  { to: '/history', icon: Clock, label: 'History' },
9
  { to: '/trends', icon: TrendingUp, label: 'Trends' },
frontend/src/index.css CHANGED
@@ -289,6 +289,12 @@ a.nav-link-item:hover > div {
289
  grid-template-columns: repeat(3, 1fr);
290
  }
291
 
 
 
 
 
 
 
292
  @media (max-width: 640px) {
293
  .landing-stats {
294
  grid-template-columns: 1fr !important;
@@ -313,6 +319,10 @@ a.nav-link-item:hover > div {
313
  grid-template-columns: 1fr !important;
314
  gap: 32px !important;
315
  }
 
 
 
 
316
  }
317
 
318
  /* ── Verdict breaking-news banner ──────────────────────── */
 
289
  grid-template-columns: repeat(3, 1fr);
290
  }
291
 
292
+ @media (max-width: 900px) {
293
+ .hero-mock {
294
+ display: none !important;
295
+ }
296
+ }
297
+
298
  @media (max-width: 640px) {
299
  .landing-stats {
300
  grid-template-columns: 1fr !important;
 
319
  grid-template-columns: 1fr !important;
320
  gap: 32px !important;
321
  }
322
+
323
+ .hero-mock {
324
+ display: none !important;
325
+ }
326
  }
327
 
328
  /* ── Verdict breaking-news banner ──────────────────────── */
frontend/src/pages/LandingPage.jsx CHANGED
@@ -1,6 +1,6 @@
1
  import { useState } from 'react'
2
  import { Link, useNavigate } from 'react-router-dom'
3
- import { FileText, Link2, Image, Video, ArrowRight, Database, ShieldCheck, Github, BookOpen, Clock, TrendingUp } from 'lucide-react'
4
  import { PAGE_STYLE } from '../App.jsx'
5
 
6
  /* ─── data ──────────────────────────────────────────────────── */
@@ -81,6 +81,11 @@ export default function LandingPage() {
81
  position: 'relative',
82
  overflow: 'hidden',
83
  borderBottom: '1px solid var(--border)',
 
 
 
 
 
84
  }}
85
  >
86
  {/* Red diagonal gradient overlay */}
@@ -109,8 +114,16 @@ export default function LandingPage() {
109
  }}
110
  />
111
 
112
- {/* Content */}
113
- <div style={{ ...PAGE_STYLE, paddingTop: 80, paddingBottom: 80 }}>
 
 
 
 
 
 
 
 
114
  {/* Eyebrow */}
115
  <p
116
  className="fade-up-1"
@@ -126,18 +139,18 @@ export default function LandingPage() {
126
  Philippine Fact-Check Engine &nbsp;·&nbsp; Multimodal AI
127
  </p>
128
 
129
- {/* Main headline — clamp as per UI/UX Pro Max exaggerated-minimalism */}
130
  <h1
131
  className="fade-up-2"
132
  style={{
133
  fontFamily: 'var(--font-display)',
134
- fontSize: 'clamp(2.8rem, 9vw, 7.5rem)',
135
  fontWeight: 800,
136
- lineHeight: 0.95,
137
  letterSpacing: '-0.03em',
138
  color: 'var(--text-primary)',
139
  marginBottom: 32,
140
- maxWidth: 820,
141
  }}
142
  >
143
  VERIFY<br />
@@ -145,19 +158,19 @@ export default function LandingPage() {
145
  <span style={{ color: 'var(--accent-red)' }}>YOU SHARE.</span>
146
  </h1>
147
 
148
- {/* Subline */}
149
  <p
150
  className="fade-up-3"
151
  style={{
152
  fontFamily: 'var(--font-body)',
153
- fontSize: 'clamp(1rem, 2vw, 1.2rem)',
154
  color: 'var(--text-secondary)',
155
- maxWidth: 520,
156
- lineHeight: 1.7,
157
  marginBottom: 48,
158
  }}
159
  >
160
- PhilVerify checks claims, URLs, images, and videos against live news evidence — built for Tagalog, English, and Taglish content.
161
  </p>
162
 
163
  {/* CTA */}
@@ -213,6 +226,165 @@ export default function LandingPage() {
213
  API Docs
214
  </a>
215
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
216
  </div>
217
  </section>
218
 
@@ -322,7 +494,7 @@ export default function LandingPage() {
322
  {MODES.map(({ icon: Icon, label, desc }) => (
323
  <Link
324
  key={label}
325
- to="/verify"
326
  style={{ textDecoration: 'none' }}
327
  >
328
  <div
@@ -335,28 +507,33 @@ export default function LandingPage() {
335
  transition: 'border-color 0.2s ease-out, background 0.2s ease-out',
336
  cursor: 'pointer',
337
  height: '100%',
 
 
338
  }}
339
  onMouseEnter={e => {
340
  e.currentTarget.style.borderLeftColor = 'var(--accent-red)'
341
  e.currentTarget.style.background = 'var(--bg-elevated)'
 
 
342
  }}
343
  onMouseLeave={e => {
344
  e.currentTarget.style.borderLeftColor = 'transparent'
345
  e.currentTarget.style.background = 'var(--bg-surface)'
 
 
346
  }}
347
  >
348
  <Icon
349
- size={20}
350
- strokeWidth={1.5}
351
- style={{ color: 'var(--accent-red)', marginBottom: 16 }}
352
  />
353
  <div
354
  style={{
355
  fontFamily: 'var(--font-display)',
356
- fontSize: 13,
357
- fontWeight: 700,
358
- letterSpacing: '0.15em',
359
- textTransform: 'uppercase',
360
  color: 'var(--text-primary)',
361
  marginBottom: 10,
362
  }}
@@ -366,13 +543,34 @@ export default function LandingPage() {
366
  <p
367
  style={{
368
  fontFamily: 'var(--font-body)',
369
- fontSize: 14,
370
  color: 'var(--text-secondary)',
371
  lineHeight: 1.6,
 
372
  }}
373
  >
374
  {desc}
375
  </p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
376
  </div>
377
  </Link>
378
  ))}
@@ -382,7 +580,7 @@ export default function LandingPage() {
382
 
383
  {/* ── Inline CTA Teaser ─────────────────────────────── */}
384
  <section style={{ borderBottom: '1px solid var(--border)', background: 'var(--bg-elevated)' }}>
385
- <div style={{ ...PAGE_STYLE, paddingTop: 48, paddingBottom: 48 }}>
386
  <p style={{
387
  fontFamily: 'var(--font-mono)',
388
  fontSize: 11,
@@ -393,7 +591,7 @@ export default function LandingPage() {
393
  }}>
394
  Try it now — no account needed
395
  </p>
396
- <form onSubmit={handleTrySubmit} style={{ display: 'flex', gap: 0, maxWidth: 640 }}>
397
  <input
398
  type="text"
399
  value={tryInput}
@@ -584,12 +782,12 @@ export default function LandingPage() {
584
  <h2
585
  style={{
586
  fontFamily: 'var(--font-display)',
587
- fontSize: 'clamp(1.8rem, 5vw, 3.5rem)',
588
  fontWeight: 800,
589
  letterSpacing: '-0.02em',
590
  color: '#fff',
591
- lineHeight: 1,
592
- maxWidth: 600,
593
  }}
594
  >
595
  STOP MISINFORMATION.<br />START VERIFYING.
 
1
  import { useState } from 'react'
2
  import { Link, useNavigate } from 'react-router-dom'
3
+ import { FileText, Link2, Image, Video, ArrowRight, Database, ShieldCheck, Github, BookOpen, Clock, TrendingUp, RefreshCw } from 'lucide-react'
4
  import { PAGE_STYLE } from '../App.jsx'
5
 
6
  /* ─── data ──────────────────────────────────────────────────── */
 
81
  position: 'relative',
82
  overflow: 'hidden',
83
  borderBottom: '1px solid var(--border)',
84
+ backgroundColor: '#0d0d0d',
85
+ backgroundImage: [
86
+ 'repeating-linear-gradient(45deg, rgba(245,240,232,0.022) 0px, rgba(245,240,232,0.022) 1px, transparent 1px, transparent 28px)',
87
+ 'repeating-linear-gradient(-45deg, rgba(245,240,232,0.022) 0px, rgba(245,240,232,0.022) 1px, transparent 1px, transparent 28px)',
88
+ ].join(', '),
89
  }}
90
  >
91
  {/* Red diagonal gradient overlay */}
 
114
  }}
115
  />
116
 
117
+ {/* Content — two-column: headline left, mock preview right */}
118
+ <div style={{
119
+ ...PAGE_STYLE,
120
+ paddingTop: 80,
121
+ paddingBottom: 80,
122
+ display: 'flex',
123
+ alignItems: 'center',
124
+ gap: 64,
125
+ }}>
126
+ <div style={{ flex: '1 1 auto', minWidth: 0 }}>
127
  {/* Eyebrow */}
128
  <p
129
  className="fade-up-1"
 
139
  Philippine Fact-Check Engine &nbsp;·&nbsp; Multimodal AI
140
  </p>
141
 
142
+ {/* Main headline */}
143
  <h1
144
  className="fade-up-2"
145
  style={{
146
  fontFamily: 'var(--font-display)',
147
+ fontSize: 'clamp(2rem, 3.6vw, 3.8rem)',
148
  fontWeight: 800,
149
+ lineHeight: 0.93,
150
  letterSpacing: '-0.03em',
151
  color: 'var(--text-primary)',
152
  marginBottom: 32,
153
+ whiteSpace: 'nowrap',
154
  }}
155
  >
156
  VERIFY<br />
 
158
  <span style={{ color: 'var(--accent-red)' }}>YOU SHARE.</span>
159
  </h1>
160
 
161
+ {/* Subline — #8: tighter max-width prevents bad wrapping at mid viewports */}
162
  <p
163
  className="fade-up-3"
164
  style={{
165
  fontFamily: 'var(--font-body)',
166
+ fontSize: 'clamp(1rem, 1.8vw, 1.15rem)',
167
  color: 'var(--text-secondary)',
168
+ maxWidth: 440,
169
+ lineHeight: 1.75,
170
  marginBottom: 48,
171
  }}
172
  >
173
+ PhilVerify checks claims, URLs, images, and videos against live news evidence — built for Tagalog, English, and Taglish.
174
  </p>
175
 
176
  {/* CTA */}
 
226
  API Docs
227
  </a>
228
  </div>
229
+ </div>{/* end left col */}
230
+
231
+ {/* Right column: mock result card — faithful miniature of the real output */}
232
+ <div
233
+ className="hero-mock"
234
+ aria-hidden="true"
235
+ style={{
236
+ flex: '0 0 340px',
237
+ width: 340,
238
+ background: 'var(--bg-base)',
239
+ border: '1px solid var(--border)',
240
+ position: 'relative',
241
+ overflow: 'hidden',
242
+ alignSelf: 'stretch',
243
+ flexShrink: 0,
244
+ display: 'flex',
245
+ flexDirection: 'column',
246
+ }}
247
+ >
248
+ {/* Fade-out at bottom */}
249
+ <div style={{
250
+ position: 'absolute',
251
+ bottom: 0, left: 0, right: 0, height: 120,
252
+ background: 'linear-gradient(transparent, var(--bg-base))',
253
+ zIndex: 2,
254
+ pointerEvents: 'none',
255
+ }} />
256
+
257
+ {/* Header bar */}
258
+ <div style={{
259
+ display: 'flex', alignItems: 'center', justifyContent: 'space-between',
260
+ padding: '8px 12px',
261
+ borderBottom: '1px solid var(--border)',
262
+ background: 'var(--bg-surface)',
263
+ }}>
264
+ <span style={{ fontFamily: 'var(--font-mono)', fontSize: 8, letterSpacing: '0.18em', textTransform: 'uppercase', color: 'var(--text-muted)' }}>Last Verification</span>
265
+ <span style={{
266
+ display: 'inline-flex', alignItems: 'center', gap: 4,
267
+ fontFamily: 'var(--font-display)', fontSize: 8, fontWeight: 700, letterSpacing: '0.12em', textTransform: 'uppercase',
268
+ color: 'var(--accent-red)', cursor: 'default',
269
+ }}>
270
+ <RefreshCw size={8} strokeWidth={2} /> Verify Again
271
+ </span>
272
+ </div>
273
+
274
+ <div style={{ padding: '10px 12px', display: 'flex', flexDirection: 'column', gap: 8 }}>
275
+
276
+ {/* Row 1: gauge + verdict explanation */}
277
+ <div style={{ display: 'grid', gridTemplateColumns: '80px 1fr', gap: 8 }}>
278
+ {/* Gauge */}
279
+ <div style={{
280
+ background: 'var(--bg-surface)',
281
+ border: '1px solid var(--border)',
282
+ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center',
283
+ padding: '10px 6px', gap: 6,
284
+ }}>
285
+ <svg width="52" height="52" viewBox="0 0 52 52" fill="none">
286
+ <circle cx="26" cy="26" r="22" stroke="var(--bg-elevated)" strokeWidth="5" fill="none"/>
287
+ <circle cx="26" cy="26" r="22" stroke="#dc2626" strokeWidth="5" fill="none"
288
+ strokeDasharray={`${2*Math.PI*22*0.32} ${2*Math.PI*22*(1-0.32)}`}
289
+ strokeDashoffset={2*Math.PI*22*0.25} strokeLinecap="butt" transform="rotate(-90 26 26)"/>
290
+ <text x="26" y="29" textAnchor="middle" fill="#dc2626" fontSize="13" fontWeight="800" fontFamily="Syne, sans-serif">32</text>
291
+ </svg>
292
+ <span style={{ fontFamily: 'var(--font-display)', fontSize: 7, fontWeight: 700, letterSpacing: '0.14em', textTransform: 'uppercase', color: 'var(--text-muted)' }}>Credibility</span>
293
+ <span style={{
294
+ fontFamily: 'var(--font-display)', fontSize: 8, fontWeight: 800, letterSpacing: '0.1em', textTransform: 'uppercase',
295
+ padding: '2px 6px', background: 'rgba(220,38,38,0.15)', color: '#f87171', border: '1px solid rgba(220,38,38,0.4)',
296
+ }}>✕ False</span>
297
+ </div>
298
+ {/* Verdict box + meta */}
299
+ <div style={{ background: 'var(--bg-surface)', border: '1px solid var(--border)', padding: '8px' }}>
300
+ <div style={{ padding: '6px 7px', background: 'rgba(220,38,38,0.08)', border: '1px solid rgba(220,38,38,0.25)', marginBottom: 7 }}>
301
+ <p style={{ fontFamily: 'var(--font-display)', fontSize: 8, fontWeight: 700, color: '#f87171', marginBottom: 2 }}>What does this mean?</p>
302
+ <p style={{ fontFamily: 'var(--font-body)', fontSize: 8, color: 'var(--text-secondary)', lineHeight: 1.5 }}>Strong signs of false or misleading content. Verify from trusted sources.</p>
303
+ </div>
304
+ <p style={{ fontFamily: 'var(--font-display)', fontSize: 7, letterSpacing: '0.14em', textTransform: 'uppercase', color: 'var(--text-muted)', marginBottom: 4 }}>Analysis Details</p>
305
+ {[['Language','English'],['Sentiment','neutral'],['Emotion','neutral'],['Confidence','73.9%'],['Processed in','33412 ms']].map(([k,v],i) => (
306
+ <div key={k} style={{ display: 'flex', justifyContent: 'space-between', padding: '2px 0', borderBottom: i < 4 ? '1px solid var(--border)' : 'none' }}>
307
+ <span style={{ fontFamily: 'var(--font-body)', fontSize: 8, color: 'var(--text-muted)' }}>{k}</span>
308
+ <span style={{ fontFamily: 'var(--font-mono)', fontSize: 8, color: i >= 3 ? '#dc2626' : 'var(--text-secondary)' }}>{v}</span>
309
+ </div>
310
+ ))}
311
+ </div>
312
+ </div>
313
+
314
+ {/* Score breakdown */}
315
+ <div style={{ background: 'var(--bg-surface)', border: '1px solid var(--border)', padding: '8px' }}>
316
+ <p style={{ fontFamily: 'var(--font-display)', fontSize: 7, fontWeight: 700, letterSpacing: '0.14em', textTransform: 'uppercase', color: 'var(--text-muted)', marginBottom: 6 }}>Score Breakdown</p>
317
+ {[
318
+ ['ML Classifier (Layer 1 — 40% weight)', 74, 'var(--accent-cyan, #22d3ee)'],
319
+ ['Evidence Cross-Check (Layer 2 — 60% weight)', 36, '#f59e0b'],
320
+ ['Final Credibility Score', 32, '#dc2626'],
321
+ ].map(([label, val, color]) => (
322
+ <div key={label} style={{ marginBottom: 6 }}>
323
+ <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 2 }}>
324
+ <span style={{ fontFamily: 'var(--font-body)', fontSize: 8, color: 'var(--text-muted)' }}>{label}</span>
325
+ <span style={{ fontFamily: 'var(--font-mono)', fontSize: 8, fontWeight: 700, color }}>{val}%</span>
326
+ </div>
327
+ <div style={{ height: 3, background: 'var(--bg-elevated)' }}>
328
+ <div style={{ width: `${val}%`, height: '100%', background: color }} />
329
+ </div>
330
+ </div>
331
+ ))}
332
+ <p style={{ fontFamily: 'var(--font-body)', fontSize: 8, color: '#dc2626', marginTop: 4, fontWeight: 600 }}>Likely false — multiple red flags and contradicting evidence found.</p>
333
+ </div>
334
+
335
+ {/* Layer cards */}
336
+ <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 8 }}>
337
+ {[
338
+ { title: 'Layer 1 — AI Analysis', score: 74, verdict: '? Unverified', body: 'The AI model found this mostly consistent with credible content.' },
339
+ { title: 'Layer 2 — Evidence Check', score: 36, verdict: '? Unverified', body: 'Found 5 related articles — some contradict or debunk this claim.' },
340
+ ].map(({ title, score, verdict, body }) => (
341
+ <div key={title} style={{ background: 'var(--bg-surface)', border: '1px solid var(--border)', padding: '8px' }}>
342
+ <p style={{ fontFamily: 'var(--font-display)', fontSize: 7, fontWeight: 800, letterSpacing: '0.1em', textTransform: 'uppercase', color: 'var(--text-primary)', marginBottom: 3 }}>{title}</p>
343
+ <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 4 }}>
344
+ <span style={{ fontFamily: 'var(--font-display)', fontSize: 7, fontWeight: 700, padding: '1px 5px', background: 'rgba(234,179,8,0.12)', color: '#fbbf24', border: '1px solid rgba(234,179,8,0.3)' }}>{verdict}</span>
345
+ <span style={{ fontFamily: 'var(--font-mono)', fontSize: 10, fontWeight: 700, color: '#fbbf24' }}>{score}%</span>
346
+ </div>
347
+ <div style={{ height: 2, background: 'var(--bg-elevated)', marginBottom: 5 }}>
348
+ <div style={{ width: `${score}%`, height: '100%', background: '#fbbf24' }} />
349
+ </div>
350
+ <p style={{ fontFamily: 'var(--font-body)', fontSize: 8, color: 'var(--text-secondary)', lineHeight: 1.5 }}>{body}</p>
351
+ </div>
352
+ ))}
353
+ </div>
354
+
355
+ {/* Named Entities */}
356
+ <div style={{ background: 'var(--bg-surface)', border: '1px solid var(--border)', padding: '8px' }}>
357
+ <p style={{ fontFamily: 'var(--font-display)', fontSize: 7, fontWeight: 700, letterSpacing: '0.14em', textTransform: 'uppercase', color: 'var(--text-muted)', marginBottom: 5 }}>Named Entities <span style={{ color: 'var(--accent-red)' }}>1</span></p>
358
+ <div style={{ display: 'flex', gap: 4 }}>
359
+ <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4, padding: '2px 6px', background: 'var(--bg-elevated)', border: '1px solid rgba(239,68,68,0.2)' }}>
360
+ <span style={{ fontFamily: 'var(--font-display)', fontSize: 7, letterSpacing: '0.1em', color: '#f87171' }}>PERSON</span>
361
+ <span style={{ fontFamily: 'var(--font-body)', fontSize: 8, color: 'var(--text-primary)' }}>Marcos</span>
362
+ </span>
363
+ </div>
364
+ </div>
365
+
366
+ {/* Evidence Sources */}
367
+ <div style={{ background: 'var(--bg-surface)', border: '1px solid var(--border)', padding: '8px' }}>
368
+ <p style={{ fontFamily: 'var(--font-display)', fontSize: 7, fontWeight: 700, letterSpacing: '0.14em', textTransform: 'uppercase', color: 'var(--text-muted)', marginBottom: 5 }}>Evidence Sources <span style={{ color: 'var(--accent-red)' }}>5</span></p>
369
+ {[
370
+ ['PBBM: 1.4K OFWs want out, PH in talks with Middle East authorities', 'Philippine News Agency', '18%'],
371
+ ['PNP: No continuing killings under Marcos administration', 'Inquirer.net', '46%'],
372
+ ['Marcos hoping for ceasefire in the Middle East', 'ABS-CBN', '34%'],
373
+ ['Marcos manages to silence the press', 'The Manila Times', '45%'],
374
+ ].map(([title, source, pct]) => (
375
+ <div key={title} style={{ padding: '5px 6px', background: 'var(--bg-elevated)', border: '1px solid var(--border)', marginBottom: 4 }}>
376
+ <p style={{ fontFamily: 'var(--font-body)', fontSize: 8, color: 'var(--text-primary)', marginBottom: 2, lineHeight: 1.4 }}>{title}</p>
377
+ <div style={{ display: 'flex', gap: 8 }}>
378
+ <span style={{ fontFamily: 'var(--font-mono)', fontSize: 7, color: 'var(--text-muted)' }}>{source}</span>
379
+ <span style={{ fontFamily: 'var(--font-mono)', fontSize: 7, color: 'var(--text-muted)' }}>Not Enough Info</span>
380
+ <span style={{ fontFamily: 'var(--font-mono)', fontSize: 7, color: 'var(--text-muted)' }}>{pct} match</span>
381
+ </div>
382
+ </div>
383
+ ))}
384
+ </div>
385
+
386
+ </div>
387
+ </div>
388
  </div>
389
  </section>
390
 
 
494
  {MODES.map(({ icon: Icon, label, desc }) => (
495
  <Link
496
  key={label}
497
+ to={`/verify?tab=${label.toLowerCase()}`}
498
  style={{ textDecoration: 'none' }}
499
  >
500
  <div
 
507
  transition: 'border-color 0.2s ease-out, background 0.2s ease-out',
508
  cursor: 'pointer',
509
  height: '100%',
510
+ display: 'flex',
511
+ flexDirection: 'column',
512
  }}
513
  onMouseEnter={e => {
514
  e.currentTarget.style.borderLeftColor = 'var(--accent-red)'
515
  e.currentTarget.style.background = 'var(--bg-elevated)'
516
+ const cta = e.currentTarget.querySelector('.mode-cta')
517
+ if (cta) { cta.style.opacity = '1'; cta.style.transform = 'translateY(0)' }
518
  }}
519
  onMouseLeave={e => {
520
  e.currentTarget.style.borderLeftColor = 'transparent'
521
  e.currentTarget.style.background = 'var(--bg-surface)'
522
+ const cta = e.currentTarget.querySelector('.mode-cta')
523
+ if (cta) { cta.style.opacity = '0'; cta.style.transform = 'translateY(5px)' }
524
  }}
525
  >
526
  <Icon
527
+ size={28}
528
+ strokeWidth={1.4}
529
+ style={{ color: 'var(--accent-red)', marginBottom: 20 }}
530
  />
531
  <div
532
  style={{
533
  fontFamily: 'var(--font-display)',
534
+ fontSize: 17,
535
+ fontWeight: 800,
536
+ letterSpacing: '-0.01em',
 
537
  color: 'var(--text-primary)',
538
  marginBottom: 10,
539
  }}
 
543
  <p
544
  style={{
545
  fontFamily: 'var(--font-body)',
546
+ fontSize: 13,
547
  color: 'var(--text-secondary)',
548
  lineHeight: 1.6,
549
+ flex: 1,
550
  }}
551
  >
552
  {desc}
553
  </p>
554
+ <div
555
+ className="mode-cta"
556
+ style={{
557
+ marginTop: 18,
558
+ display: 'flex',
559
+ alignItems: 'center',
560
+ gap: 6,
561
+ fontFamily: 'var(--font-display)',
562
+ fontSize: 11,
563
+ fontWeight: 700,
564
+ letterSpacing: '0.15em',
565
+ textTransform: 'uppercase',
566
+ color: 'var(--accent-red)',
567
+ opacity: 0,
568
+ transform: 'translateY(5px)',
569
+ transition: 'opacity 0.2s ease-out, transform 0.2s ease-out',
570
+ }}
571
+ >
572
+ Try {label} <ArrowRight size={12} strokeWidth={2.5} />
573
+ </div>
574
  </div>
575
  </Link>
576
  ))}
 
580
 
581
  {/* ── Inline CTA Teaser ─────────────────────────────── */}
582
  <section style={{ borderBottom: '1px solid var(--border)', background: 'var(--bg-elevated)' }}>
583
+ <div style={{ ...PAGE_STYLE, paddingTop: 48, paddingBottom: 48, display: 'flex', flexDirection: 'column', alignItems: 'center', textAlign: 'center' }}>
584
  <p style={{
585
  fontFamily: 'var(--font-mono)',
586
  fontSize: 11,
 
591
  }}>
592
  Try it now — no account needed
593
  </p>
594
+ <form onSubmit={handleTrySubmit} style={{ display: 'flex', gap: 0, width: '100%' }}>
595
  <input
596
  type="text"
597
  value={tryInput}
 
782
  <h2
783
  style={{
784
  fontFamily: 'var(--font-display)',
785
+ fontSize: 'clamp(1.6rem, 3.5vw, 3rem)',
786
  fontWeight: 800,
787
  letterSpacing: '-0.02em',
788
  color: '#fff',
789
+ lineHeight: 1.05,
790
+ maxWidth: 700,
791
  }}
792
  >
793
  STOP MISINFORMATION.<br />START VERIFYING.
huggingface-space-README.md ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: PhilVerify API
3
+ emoji: 🇵🇭
4
+ colorFrom: red
5
+ colorTo: blue
6
+ sdk: docker
7
+ app_port: 7860
8
+ pinned: false
9
+ ---
10
+
11
+ # PhilVerify API
12
+
13
+ Multimodal fake news detection for Philippine social media.
14
+
15
+ Supports text, URL, image (OCR), and video/audio (Whisper ASR) inputs.