Skip to content

Commit e3c47e8

Browse files
authored
Agent/fix langfuse jest esm (#83)
* fix(api): run Jest with VM modules * feat(web): add maintenance banner and disable sign-in buttons - Add a status banner at top of landing page communicating production is temporarily offline (Neon DB credit limit hit) - Banner includes a pulsing amber dot, a plain-English status message, and a 'Follow progress on GitHub' link to the repo - Disable all three Sign-in-with-Google buttons (navbar, hero CTA, final CTA) by converting them to inert <span> elements - Add .btnDisabled CSS class (opacity, grayscale, not-allowed cursor) - Revert is a one-line change once production is restored * feat(web): simplify footer to X and GitHub profile links Keep only 𝕏/zavxai and GitHub/zavxai in the landing footer, drop extra social links, and point profiles at the zavxai accounts.
1 parent bd79264 commit e3c47e8

2 files changed

Lines changed: 175 additions & 25 deletions

File tree

apps/web/src/app/page.module.css

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,99 @@
4040
letter-spacing: -0.02em;
4141
}
4242

43+
/* ===== STATUS BANNER ===== */
44+
@keyframes pulse-dot {
45+
0%, 100% { opacity: 1; transform: scale(1); }
46+
50% { opacity: 0.5; transform: scale(0.75); }
47+
}
48+
49+
@keyframes slide-down {
50+
from { opacity: 0; transform: translateY(-8px); }
51+
to { opacity: 1; transform: translateY(0); }
52+
}
53+
54+
.statusBanner {
55+
width: 100%;
56+
background: linear-gradient(90deg,
57+
rgba(245, 158, 11, 0.06) 0%,
58+
rgba(245, 158, 11, 0.04) 50%,
59+
rgba(245, 158, 11, 0.06) 100%);
60+
border-bottom: 1px solid rgba(245, 158, 11, 0.18);
61+
padding: 0.65rem 2rem;
62+
animation: slide-down 0.4s ease both;
63+
}
64+
65+
.statusBannerInner {
66+
max-width: 1100px;
67+
margin: 0 auto;
68+
display: flex;
69+
align-items: center;
70+
gap: 1.25rem;
71+
flex-wrap: wrap;
72+
}
73+
74+
.statusIndicator {
75+
display: flex;
76+
align-items: center;
77+
gap: 0.5rem;
78+
flex-shrink: 0;
79+
}
80+
81+
.statusDot {
82+
display: block;
83+
width: 7px;
84+
height: 7px;
85+
border-radius: 50%;
86+
background: #f59e0b;
87+
box-shadow: 0 0 6px rgba(245, 158, 11, 0.6);
88+
animation: pulse-dot 2s ease-in-out infinite;
89+
}
90+
91+
.statusLabel {
92+
font-family: var(--font-mono);
93+
font-size: 0.7rem;
94+
font-weight: 600;
95+
letter-spacing: 0.08em;
96+
text-transform: uppercase;
97+
color: #f59e0b;
98+
}
99+
100+
.statusText {
101+
font-size: 0.8rem;
102+
color: var(--text-secondary);
103+
flex: 1;
104+
min-width: 0;
105+
}
106+
107+
.statusLink {
108+
display: inline-flex;
109+
align-items: center;
110+
gap: 0.3rem;
111+
font-size: 0.78rem;
112+
font-weight: 500;
113+
color: rgba(255, 255, 255, 0.6) !important;
114+
border: 1px solid rgba(255, 255, 255, 0.12);
115+
border-radius: 6px;
116+
padding: 0.25rem 0.65rem;
117+
transition: color 0.2s ease, border-color 0.2s ease, background 0.2s ease;
118+
white-space: nowrap;
119+
flex-shrink: 0;
120+
text-decoration: none;
121+
}
122+
123+
.statusLink:hover {
124+
color: rgba(255, 255, 255, 0.9) !important;
125+
border-color: rgba(255, 255, 255, 0.28);
126+
background: rgba(255, 255, 255, 0.04);
127+
}
128+
129+
@media (max-width: 600px) {
130+
.statusBanner { padding: 0.6rem 1.25rem; }
131+
.statusText { font-size: 0.75rem; }
132+
}
133+
43134
/* ===== NAVBAR ===== */
135+
44136
.navbar {
45137
position: sticky;
46138
top: 1rem;
@@ -117,6 +209,21 @@
117209
color: #000;
118210
}
119211

212+
/* Disabled state — used while production is down */
213+
.btnDisabled {
214+
opacity: 0.35;
215+
cursor: not-allowed !important;
216+
pointer-events: none;
217+
filter: grayscale(0.6);
218+
box-shadow: none !important;
219+
text-decoration: none !important;
220+
}
221+
.btnDisabled:hover {
222+
opacity: 0.35;
223+
background-color: inherit;
224+
color: inherit;
225+
}
226+
120227
/* ===== HERO ===== */
121228
.hero {
122229
position: relative;
@@ -895,6 +1002,23 @@
8951002
color: var(--accent);
8961003
}
8971004

1005+
.footerLink {
1006+
display: inline-flex;
1007+
align-items: center;
1008+
gap: 0.35rem;
1009+
}
1010+
1011+
.footerIcon {
1012+
width: 0.95rem;
1013+
height: 0.95rem;
1014+
flex-shrink: 0;
1015+
}
1016+
1017+
.footerSlash {
1018+
color: var(--border);
1019+
user-select: none;
1020+
}
1021+
8981022
.footerDot {
8991023
color: var(--border);
9001024
}

apps/web/src/app/page.tsx

Lines changed: 51 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,9 @@ import Image from 'next/image'
66
import styles from './page.module.css'
77
import { API_BASE as API_URL, useAuth } from '@/src/lib/auth-context'
88

9-
const PORTFOLIO_URL = 'https://johnvesslyalti.xyz'
10-
const GITHUB_PROFILE_URL = 'https://github.com/johnvesslyalti'
11-
const GITHUB_REPO_URL = 'https://github.com/johnvesslyalti/inferr'
9+
const GITHUB_PROFILE_URL = 'https://github.com/zavxai'
10+
const GITHUB_REPO_URL = 'https://github.com/zavxai/inferr'
1211
const X_URL = 'https://x.com/zavxai'
13-
const LINKEDIN_URL = 'https://www.linkedin.com/in/johnvesslyalti-ai-engineer'
14-
const EMAIL_URL = 'mailto:altijohnvessly@gmail.com'
1512

1613
const features = [
1714
{
@@ -207,6 +204,31 @@ export default function Home() {
207204
return (
208205
<div className={styles.container}>
209206

207+
{/* Status Banner */}
208+
<div className={styles.statusBanner}>
209+
<div className={styles.statusBannerInner}>
210+
<div className={styles.statusIndicator}>
211+
<span className={styles.statusDot} />
212+
<span className={styles.statusLabel}>Maintenance</span>
213+
</div>
214+
<p className={styles.statusText}>
215+
Production is temporarily offline — database credits ran out and a fix is in progress.
216+
</p>
217+
<a
218+
href={GITHUB_REPO_URL}
219+
target="_blank"
220+
rel="noopener noreferrer"
221+
className={styles.statusLink}
222+
>
223+
Follow progress on GitHub
224+
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round">
225+
<line x1="7" y1="17" x2="17" y2="7" />
226+
<polyline points="7 7 17 7 17 17" />
227+
</svg>
228+
</a>
229+
</div>
230+
</div>
231+
210232
{/* Navbar */}
211233
<nav className={`${styles.navbar} ${scrolled ? styles.scrolled : ''}`}>
212234
<div className={styles.navContent}>
@@ -215,14 +237,14 @@ export default function Home() {
215237
<span className={styles.logoText}>inferr</span>
216238
</div>
217239
<div className={styles.navRight}>
218-
<a href={`${API_URL}/auth/google`} onClick={handleSignIn} className={styles.signInBtn}>
219-
Sign in with Google
220-
</a>
240+
<span className={`${styles.signInBtn} ${styles.btnDisabled}`} title="Unavailable while maintenance is in progress">
241+
Sign in with Google
242+
</span>
221243
</div>
222244
</div>
223245
</nav>
224246

225-
{/* Hero split layout */}
247+
{/* Hero - split layout */}
226248
<section className={styles.hero}>
227249
<div className={styles.heroGlow} />
228250
<div className={styles.sectionInner}>
@@ -239,9 +261,9 @@ export default function Home() {
239261
and surfaces only what&apos;s relevant to your stack — automatically.
240262
</p>
241263
<div className={`${styles.heroActions} reveal`}>
242-
<a href={`${API_URL}/auth/google`} onClick={handleSignIn} className={styles.primaryBtn}>
243-
Sign in with Google
244-
</a>
264+
<span className={`${styles.primaryBtn} ${styles.btnDisabled}`} title="Unavailable while maintenance is in progress">
265+
Sign in with Google
266+
</span>
245267
</div>
246268
<p className={`${styles.heroNote} reveal`}>Free during early access. No credit card.</p>
247269
</div>
@@ -339,27 +361,31 @@ export default function Home() {
339361
Free. Takes 30 seconds to set up.
340362
</p>
341363
<div className="reveal">
342-
<a href={`${API_URL}/auth/google`} onClick={handleSignIn} className={styles.primaryBtnLight}>
343-
Sign in with Google
344-
</a>
364+
<span className={`${styles.primaryBtnLight} ${styles.btnDisabled}`} title="Unavailable while maintenance is in progress">
365+
Sign in with Google
366+
</span>
345367
</div>
346368
</div>
347369
</section>
348370

349371
{/* Footer */}
350372
<footer className={styles.footer}>
351373
<div className={styles.footerContent}>
352-
<span>Built by <a href={X_URL} target="_blank" rel="noopener noreferrer">@zavxai</a></span>
353-
<span className={styles.footerDot}>·</span>
354-
<a href={PORTFOLIO_URL} target="_blank" rel="noopener noreferrer">Portfolio</a>
355-
<span className={styles.footerDot}>·</span>
356-
<a href={GITHUB_PROFILE_URL} target="_blank" rel="noopener noreferrer">GitHub</a>
357-
<span className={styles.footerDot}>·</span>
358-
<a href={LINKEDIN_URL} target="_blank" rel="noopener noreferrer">LinkedIn</a>
359-
<span className={styles.footerDot}>·</span>
360-
<a href={EMAIL_URL} target="_blank" rel="noopener noreferrer">Email</a>
374+
<a href={X_URL} target="_blank" rel="noopener noreferrer" className={styles.footerLink}>
375+
<svg className={styles.footerIcon} viewBox="0 0 24 24" aria-hidden="true" fill="currentColor">
376+
<path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.744l7.727-8.835L1.254 2.25H8.08l4.253 5.622L18.244 2.25zm-1.161 17.52h1.833L7.084 4.126H5.117L17.083 19.77z" />
377+
</svg>
378+
<span className={styles.footerSlash}>/</span>
379+
<span>zavxai</span>
380+
</a>
361381
<span className={styles.footerDot}>·</span>
362-
<a href={GITHUB_REPO_URL} target="_blank" rel="noopener noreferrer">Source Code</a>
382+
<a href={GITHUB_PROFILE_URL} target="_blank" rel="noopener noreferrer" className={styles.footerLink}>
383+
<svg className={styles.footerIcon} viewBox="0 0 24 24" aria-hidden="true" fill="currentColor">
384+
<path d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0 1 12 6.844a9.59 9.59 0 0 1 2.504.337c1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.02 10.02 0 0 0 22 12.017C22 6.484 17.522 2 12 2z" />
385+
</svg>
386+
<span className={styles.footerSlash}>/</span>
387+
<span>zavxai</span>
388+
</a>
363389
</div>
364390
</footer>
365391

0 commit comments

Comments
 (0)