Skip to content

Commit c62f107

Browse files
ajitpratap0Ajit Pratap Singhclaude
authored
Fix/website audit phase2 (#412)
* fix(website): phase 2 audit — P0 bugs, playground UX, homepage, content pages P0 bugs: - Guard onRouterTransitionStart behind NEXT_PUBLIC_SENTRY_DSN check to prevent spurious router.push() redirect loops when DSN is absent - Remove clients.claim() from WASM service worker activate handler to prevent disruption of in-flight RSC fetches during page load - Navbar: add pointerEvents:none to mobile menu initial/exit states to block iOS ghost click causing accidental navigation; add type="button" to hamburger - Navbar: change all md: breakpoints → lg: so desktop nav collapses at 1024px Homepage: - AnimatedCounter: initialize display to real value to eliminate zero flash on mount; add prefers-reduced-motion guard to skip animation - Hero: move overflow-hidden from section to blobs div; add break-words/hyphens-auto to headline; fix playground link contrast text-zinc-500 → text-zinc-300 - SocialProof: fix GitHub shields.io badge URL gosqlx/gosqlx → ajitpratap0/GoSQLX - VscodeSection: fix publisher ID gosqlx.gosqlx → ajitpratap0.gosqlx Playground: - WasmLoader: fix callAndParse to separate JSON parse errors from error objects so Go WASM error responses propagate to callers instead of returning raw JSON strings - AnalyzeTab: fix all field names to match actual Go JSON output (critical_count, high_count, medium_count, low_count from security; Score, QueryComplexity, Suggestions from optimization — PascalCase because no JSON struct tags in Go) - Playground: fix breakpoints md: → lg: for side-by-side layout on desktop only Content: - GETTING_STARTED.md: replace all .md hrefs with /docs/ routes; update v1.6.0 → v1.12.0 - Sidebar: normalize trailing slash in isActive; add aria-current="page" to active link with visual left border accent - Toc: add H2/H3 visual hierarchy (weight, size, indent, ellipsis + title tooltip) - blog/page.tsx: rename "Release Notes" → "Changelog" in heading and metadata - BenchmarksContent: add competitor comparison table (GoSQLX vs xwb1989, pg_query_go, blastrain/sqlparser) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(ci): auto-trigger Glama build on every GitHub release Adds .github/workflows/glama-sync.yml which fires on every published GitHub release and does two things in parallel: 1. bump-glama-version (continue-on-error): - Strips the `v` prefix from the release tag - Updates glama.json version field via jq - Commits "[skip ci]" back to the release branch - Best-effort: silently passes if branch protection rejects the push 2. trigger-glama-build: - POSTs to Glama's admin Dockerfile endpoint with: intent=build, pinnedCommitSha=<release SHA> full build config (Go 1.26.1 download + compile) - Pins the build to the exact release commit so Glama always runs the binary that matches the published release - Gracefully skips with setup instructions when GLAMA_SESSION_COOKIE secret is not configured - Fails with a clear message when the cookie has expired Requires one-time manual setup: Repo Settings → Secrets → GLAMA_SESSION_COOKIE (Chrome DevTools → Network → copy Cookie header from glama.ai) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(website): skip SW hash update when WASM binary is absent (Vercel builds) The postbuild update-sw-hash script called fs.readFileSync on public/wasm/gosqlx.wasm which is gitignored. Vercel's automatic preview builds don't run the WASM compile step (only the GitHub Actions workflow does), causing every Vercel deployment to fail. Add an fs.existsSync guard: when the binary is absent the script prints a warning and exits 0 instead of throwing. The SW cache key remains unchanged in that case, which is correct — Vercel preview builds don't serve the WASM anyway. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(docker): bump Go base image from 1.25 to 1.26 to match go.mod go.mod requires go >= 1.26.1 but the Dockerfile was using golang:1.25-alpine (Go 1.25.8), causing all Render builds to fail with: go: go.mod requires go >= 1.26.1 (running go 1.25.8; GOTOOLCHAIN=local) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(website): comprehensive audit fixes — phase 2 & 3 Homepage: - Fix invalid double <main> nesting (layout.tsx wraps in <div> now) - StatsBar: grid layout prevents 3+1 orphan at tablet breakpoints - StatsBar: unify performance stat to 1,380,000 (matches benchmarks page) - Hero: improve hover contrast and mobile overflow handling - McpSection: fix badge contrast (zinc-500→zinc-300), add MCP guide CTA Playground: - SqlEditor: CodeMirror fills container height via theme + h-full wrapper - Playground: skeleton loading state mirrors real UI layout - FormatTab: consistent overflow handling - AnalyzeTab: C:0 H:0 M:0 L:0 severity format with hover tooltip Benchmarks: - Section heading, GoSQLX highlight row, CTA section - Accessible aria-labels on ✓/✗ symbols - Mobile swipe hint, improved dot contrast, last-updated label - Updated page title with 1.38M ops/sec Docs: - TOC width: w-48 → w-56 (224px) for better readability Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(website): VS Code & benchmarks page audit — a11y, SEO, UX fixes Benchmarks page: - Fix duplicate <main> landmark (use <div> wrapper) - Standardize h2 headings to text-2xl font-bold - Remove extra mt-16 from CTA section (fixes blank space gap) - Add scope="col" to all <th> elements (WCAG 1.3.1) - Add sr-only <caption> to both tables - Fix version v1.12.1 → v1.12.0 - Add trailing slashes to CTA hrefs - aria-hidden on methodology bullet dots - Wrap -benchmem in <code> tag - Add competitor measurement footnote - Add page-specific openGraph + alternates.canonical VS Code page: - Fix duplicate <main> landmark (use <div> wrapper) - Add sr-only <h2>Features</h2> (fix H1→H3 heading skip) - aria-label on Install Extension CTA (new tab warning) - aria-label on features <section> - role/aria-label/tabIndex on <pre> Key Settings block - Add page-specific openGraph + alternates.canonical Shared components: - FadeIn: respect prefers-reduced-motion via useReducedMotion() - Navbar: aria-current="page" on active link + active text-white style - Navbar: aria-label="Main navigation" on <nav> - TerminalMockup: aria-hidden on decorative dots, break-all→break-words - layout.tsx: relative canonical '/' (let pages override per-page) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(website): remove duplicate Competitor Comparison section on benchmarks page The second competitor comparison table (lines 186-238) was an exact duplicate of the first, rendered back-to-back. It also lacked the accessibility improvements (scope="col", aria-labels, sr-only caption) that were present on the first. Remove the stale duplicate. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Ajit Pratap Singh <ajitpratapsingh@Ajits-Mac-mini-2655.local> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent e4ae22c commit c62f107

16 files changed

Lines changed: 223 additions & 80 deletions

File tree

website/src/app/benchmarks/BenchmarksContent.tsx

Lines changed: 80 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
'use client';
22

3+
import Link from 'next/link';
34
import { FadeIn } from '@/components/ui/FadeIn';
45
import { GlassCard } from '@/components/ui/GlassCard';
56

@@ -25,9 +26,22 @@ const methodology = [
2526
'Results averaged over 5 consecutive runs to reduce variance',
2627
];
2728

29+
function renderMethodologyItem(item: string) {
30+
const FLAG = '-benchmem';
31+
const idx = item.indexOf(FLAG);
32+
if (idx === -1) return <>{item}</>;
33+
return (
34+
<>
35+
{item.slice(0, idx)}
36+
<code className="font-mono text-xs bg-white/[0.06] px-1 py-0.5 rounded">{FLAG}</code>
37+
{item.slice(idx + FLAG.length)}
38+
</>
39+
);
40+
}
41+
2842
export function BenchmarksContent() {
2943
return (
30-
<main className="min-h-screen">
44+
<div className="min-h-screen">
3145
{/* Hero */}
3246
<section className="section-padding pt-24 pb-16 text-center">
3347
<div className="container-width">
@@ -38,6 +52,9 @@ export function BenchmarksContent() {
3852
<p className="mt-4 text-lg text-zinc-400 max-w-2xl mx-auto">
3953
Real-world performance data from the GoSQLX parser, measured on production-grade hardware.
4054
</p>
55+
<p className="mt-3 text-xs text-zinc-500">
56+
Last updated: March 2026 &middot; Based on v1.12.0
57+
</p>
4158
</FadeIn>
4259
</div>
4360
</section>
@@ -62,15 +79,17 @@ export function BenchmarksContent() {
6279
<section className="section-padding pb-16">
6380
<div className="container-width">
6481
<FadeIn>
82+
<h2 className="text-2xl font-bold text-white mb-4">Parse Benchmarks</h2>
6583
<GlassCard className="p-0 overflow-hidden" hover={false}>
6684
<div className="overflow-x-auto">
6785
<table className="w-full text-sm text-left">
86+
<caption className="sr-only">GoSQLX Parse Benchmarks</caption>
6887
<thead>
6988
<tr className="border-b border-white/[0.06]">
70-
<th className="px-6 py-4 font-medium text-zinc-400">Benchmark</th>
71-
<th className="px-6 py-4 font-medium text-zinc-400">Query Type</th>
72-
<th className="px-6 py-4 font-medium text-zinc-400">Apple M4</th>
73-
<th className="px-6 py-4 font-medium text-zinc-400">Baseline (CI)</th>
89+
<th scope="col" className="px-6 py-4 font-medium text-zinc-400">Benchmark</th>
90+
<th scope="col" className="px-6 py-4 font-medium text-zinc-400">Query Type</th>
91+
<th scope="col" className="px-6 py-4 font-medium text-zinc-400">Apple M4</th>
92+
<th scope="col" className="px-6 py-4 font-medium text-zinc-400">Baseline (CI)</th>
7493
</tr>
7594
</thead>
7695
<tbody>
@@ -89,6 +108,7 @@ export function BenchmarksContent() {
89108
</table>
90109
</div>
91110
</GlassCard>
111+
<p className="text-xs text-zinc-500 mt-2 md:hidden">&larr; Swipe to see all columns &rarr;</p>
92112
</FadeIn>
93113
</div>
94114
</section>
@@ -101,48 +121,64 @@ export function BenchmarksContent() {
101121
<GlassCard className="p-0 overflow-hidden" hover={false}>
102122
<div className="overflow-x-auto">
103123
<table className="w-full text-sm text-left">
124+
<caption className="sr-only">Competitor Library Comparison</caption>
104125
<thead>
105126
<tr className="border-b border-white/[0.06]">
106-
<th className="px-6 py-4 font-medium text-zinc-400">Library</th>
107-
<th className="px-6 py-4 font-medium text-zinc-400">Language</th>
108-
<th className="px-6 py-4 font-medium text-zinc-400">Ops/sec</th>
109-
<th className="px-6 py-4 font-medium text-zinc-400">Memory/op</th>
110-
<th className="px-6 py-4 font-medium text-zinc-400">Zero-copy</th>
127+
<th scope="col" className="px-6 py-4 font-medium text-zinc-400">Library</th>
128+
<th scope="col" className="px-6 py-4 font-medium text-zinc-400">Language</th>
129+
<th scope="col" className="px-6 py-4 font-medium text-zinc-400">Ops/sec</th>
130+
<th scope="col" className="px-6 py-4 font-medium text-zinc-400">Memory/op</th>
131+
<th scope="col" className="px-6 py-4 font-medium text-zinc-400">Zero-copy</th>
111132
</tr>
112133
</thead>
113134
<tbody>
114-
<tr className="border-b border-white/[0.04] hover:bg-white/[0.03] transition-colors">
115-
<td className="px-6 py-4 text-white font-medium">GoSQLX</td>
135+
<tr className="border-b border-white/[0.04] transition-colors bg-indigo-500/5 border-l-2 border-l-indigo-500">
136+
<td className="px-6 py-4 text-white font-medium">
137+
GoSQLX{' '}
138+
<span className="ml-2 inline-block rounded-full bg-indigo-500/20 px-2 py-0.5 text-xs font-medium text-indigo-300">
139+
This Library
140+
</span>
141+
</td>
116142
<td className="px-6 py-4 text-zinc-400">Go</td>
117143
<td className="px-6 py-4 text-zinc-300 font-mono">1.38M+</td>
118144
<td className="px-6 py-4 text-zinc-300">Low</td>
119-
<td className="px-6 py-4 text-accent-green font-medium"></td>
145+
<td className="px-6 py-4 text-accent-green font-medium">
146+
<span aria-label="Yes"></span>
147+
</td>
120148
</tr>
121149
<tr className="border-b border-white/[0.04] hover:bg-white/[0.03] transition-colors">
122150
<td className="px-6 py-4 text-zinc-300 font-medium">xwb1989/sqlparser</td>
123151
<td className="px-6 py-4 text-zinc-400">Go</td>
124152
<td className="px-6 py-4 text-zinc-400 font-mono">~380K</td>
125153
<td className="px-6 py-4 text-zinc-400">Higher</td>
126-
<td className="px-6 py-4 text-zinc-500"></td>
154+
<td className="px-6 py-4 text-zinc-500">
155+
<span aria-label="No"></span>
156+
</td>
127157
</tr>
128158
<tr className="border-b border-white/[0.04] hover:bg-white/[0.03] transition-colors">
129159
<td className="px-6 py-4 text-zinc-300 font-medium">pg_query_go</td>
130160
<td className="px-6 py-4 text-zinc-400">Go</td>
131161
<td className="px-6 py-4 text-zinc-400 font-mono">~220K</td>
132162
<td className="px-6 py-4 text-zinc-400">Higher (CGo)</td>
133-
<td className="px-6 py-4 text-zinc-500"></td>
163+
<td className="px-6 py-4 text-zinc-500">
164+
<span aria-label="No"></span>
165+
</td>
134166
</tr>
135167
<tr className="border-b border-white/[0.04] hover:bg-white/[0.03] transition-colors">
136168
<td className="px-6 py-4 text-zinc-300 font-medium">blastrain/sqlparser</td>
137169
<td className="px-6 py-4 text-zinc-400">Go</td>
138170
<td className="px-6 py-4 text-zinc-400 font-mono">~290K</td>
139171
<td className="px-6 py-4 text-zinc-400">Medium</td>
140-
<td className="px-6 py-4 text-zinc-500"></td>
172+
<td className="px-6 py-4 text-zinc-500">
173+
<span aria-label="No"></span>
174+
</td>
141175
</tr>
142176
</tbody>
143177
</table>
144178
</div>
145179
</GlassCard>
180+
<p className="text-xs text-zinc-500 mt-2 md:hidden">&larr; Swipe to see all columns &rarr;</p>
181+
<p className="text-xs text-zinc-500 mt-2">* Competitor figures estimated from published benchmarks on equivalent hardware. Results may vary by query complexity.</p>
146182
</FadeIn>
147183
</div>
148184
</section>
@@ -155,14 +191,39 @@ export function BenchmarksContent() {
155191
<ul className="space-y-3">
156192
{methodology.map((item) => (
157193
<li key={item} className="flex items-start gap-3 text-sm text-zinc-400">
158-
<span className="mt-1.5 block h-1.5 w-1.5 rounded-full bg-zinc-600 shrink-0" />
159-
{item}
194+
<span aria-hidden="true" className="mt-1.5 block h-1.5 w-1.5 rounded-full bg-zinc-400 shrink-0" />
195+
<span>{renderMethodologyItem(item)}</span>
160196
</li>
161197
))}
162198
</ul>
163199
</FadeIn>
164200
</div>
165201
</section>
166-
</main>
202+
203+
{/* CTA */}
204+
<section className="section-padding pb-24">
205+
<div className="container-width">
206+
<FadeIn>
207+
<div className="text-center">
208+
<p className="text-zinc-400 mb-4">Ready to use GoSQLX in your project?</p>
209+
<div className="flex gap-3 justify-center">
210+
<Link
211+
href="/docs/getting-started/"
212+
className="inline-flex items-center rounded-lg bg-indigo-600 px-5 py-2.5 text-sm font-medium text-white hover:bg-indigo-500 transition-colors"
213+
>
214+
Get Started
215+
</Link>
216+
<Link
217+
href="/playground/"
218+
className="inline-flex items-center rounded-lg border border-white/10 bg-white/5 px-5 py-2.5 text-sm font-medium text-zinc-300 hover:bg-white/10 hover:text-white transition-colors"
219+
>
220+
Try Playground
221+
</Link>
222+
</div>
223+
</div>
224+
</FadeIn>
225+
</div>
226+
</section>
227+
</div>
167228
);
168229
}

website/src/app/benchmarks/page.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,17 @@ import type { Metadata } from 'next';
22
import { BenchmarksContent } from './BenchmarksContent';
33

44
export const metadata: Metadata = {
5-
title: 'Benchmarks',
5+
title: { absolute: 'GoSQLX Performance Benchmarks — 1.38M+ ops/sec SQL Parsing for Go' },
66
description:
7-
'GoSQLX performance benchmarks. 1.38M+ ops/sec sustained, 8M+ tokens/sec throughput, validated across 20K+ concurrent operations.',
7+
'Detailed performance benchmarks for GoSQLX: 1.38M+ ops/sec sustained throughput, 8M+ tokens/sec, zero race conditions across 20K+ concurrent operations. Compare against xwb1989/sqlparser, pg_query_go, and blastrain/sqlparser.',
8+
alternates: {
9+
canonical: '/benchmarks/',
10+
},
11+
openGraph: {
12+
title: 'GoSQLX Performance Benchmarks — 1.38M+ ops/sec SQL Parsing for Go',
13+
description: 'Detailed performance benchmarks for GoSQLX: 1.38M+ ops/sec sustained throughput, 8M+ tokens/sec, zero race conditions across 20K+ concurrent operations.',
14+
url: '/benchmarks/',
15+
},
816
};
917

1018
export default function BenchmarksPage() {

website/src/app/docs/[...slug]/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ export default async function DocPage({ params }: PageProps) {
152152
</main>
153153

154154
{/* Table of Contents */}
155-
<div className="hidden xl:block w-48 shrink-0 py-10 pr-6">
155+
<div className="hidden xl:block w-56 shrink-0 py-10 pr-6">
156156
<Toc headings={headings} />
157157
</div>
158158
</div>

website/src/app/layout.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export const metadata: Metadata = {
1414
'High-performance, zero-copy SQL parsing SDK for Go. Thread-safe with multi-dialect support for PostgreSQL, MySQL, SQLite, SQL Server, Oracle, and Snowflake.',
1515
metadataBase: new URL('https://gosqlx.dev'),
1616
alternates: {
17-
canonical: 'https://gosqlx.dev',
17+
canonical: '/',
1818
},
1919
openGraph: {
2020
type: 'website',
@@ -83,7 +83,7 @@ export default function RootLayout({
8383
}}
8484
/>
8585
<Navbar />
86-
<main id="main-content" className="pt-16">{children}</main>
86+
<div id="main-content" className="pt-16">{children}</div>
8787
<Footer />
8888
<ServiceWorkerRegister />
8989
</body>

website/src/app/vscode/VscodeContent.tsx

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ const features = [
3434

3535
export function VscodeContent() {
3636
return (
37-
<main className="min-h-screen">
37+
<div className="min-h-screen">
3838
{/* Hero */}
3939
<section className="section-padding pt-24 pb-16 text-center">
4040
<div className="container-width">
@@ -51,6 +51,7 @@ export function VscodeContent() {
5151
variant="primary"
5252
href="https://marketplace.visualstudio.com/items?itemName=ajitpratap0.gosqlx"
5353
external
54+
aria-label="Install Extension (opens in new tab)"
5455
>
5556
Install Extension
5657
</Button>
@@ -60,8 +61,9 @@ export function VscodeContent() {
6061
</section>
6162

6263
{/* Feature Grid */}
63-
<section className="section-padding pb-16">
64+
<section className="section-padding pb-16" aria-label="Features">
6465
<div className="container-width">
66+
<h2 className="sr-only">Features</h2>
6567
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
6668
{features.map((f, i) => (
6769
<FadeIn key={f.title} delay={i * 0.08}>
@@ -95,7 +97,12 @@ export function VscodeContent() {
9597
Key Settings
9698
</h2>
9799
<GlassCard className="p-6" hover={false}>
98-
<pre className="font-mono text-sm text-zinc-300 whitespace-pre overflow-x-auto">
100+
<pre
101+
role="region"
102+
aria-label="Key Settings JSON"
103+
tabIndex={0}
104+
className="font-mono text-sm text-zinc-300 whitespace-pre overflow-x-auto"
105+
>
99106
{`{
100107
"gosqlx.executablePath": "/usr/local/bin/gosqlx",
101108
"gosqlx.forcePathLookup": false
@@ -105,6 +112,6 @@ export function VscodeContent() {
105112
</FadeIn>
106113
</div>
107114
</section>
108-
</main>
115+
</div>
109116
);
110117
}

website/src/app/vscode/page.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,15 @@ import { VscodeContent } from './VscodeContent';
44
export const metadata: Metadata = {
55
title: 'VS Code Extension',
66
description:
7-
'Real-time SQL validation, formatting, and linting for VS Code. Powered by the GoSQLX parser with multi-dialect support.',
7+
'Real-time SQL validation, formatting, and linting for VS Code. GoSQLX powers instant diagnostics, auto-formatting, and 10 built-in lint rules with multi-dialect support.',
8+
alternates: {
9+
canonical: '/vscode/',
10+
},
11+
openGraph: {
12+
title: 'GoSQLX VS Code Extension — SQL Diagnostics, Formatting & Linting',
13+
description: 'Real-time SQL validation, formatting, and linting for VS Code. Powered by GoSQLX with multi-dialect support.',
14+
url: '/vscode/',
15+
},
816
};
917

1018
export default function VscodePage() {

website/src/components/home/Hero.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ const SAMPLE_AST = `{
4747

4848
export function Hero() {
4949
return (
50-
<section className="relative min-h-screen flex items-center justify-center">
50+
<section className="relative min-h-screen flex items-center justify-center overflow-hidden">
5151
{/* Background gradient mesh */}
5252
<div className="absolute inset-0 pointer-events-none overflow-hidden" aria-hidden="true">
5353
{/* Top-right indigo glow */}
@@ -89,7 +89,7 @@ export function Hero() {
8989
{/* Headline */}
9090
<FadeIn delay={0.1}>
9191
<h1
92-
className="text-3xl sm:text-5xl md:text-6xl lg:text-7xl font-bold mb-6 break-words hyphens-auto"
92+
className="text-3xl sm:text-5xl md:text-6xl lg:text-7xl font-bold mb-6 break-words hyphens-auto w-full max-w-full px-4 sm:px-0"
9393
style={{ letterSpacing: '-0.03em' }}
9494
>
9595
<GradientText>Parse SQL at the speed of Go</GradientText>
@@ -165,7 +165,7 @@ export function Hero() {
165165
<div className="mt-6">
166166
<Link
167167
href="/playground"
168-
className="text-sm text-zinc-300 hover:text-zinc-300 transition-colors inline-flex items-center gap-1.5"
168+
className="text-sm text-zinc-300 hover:text-white transition-colors inline-flex items-center gap-1.5"
169169
>
170170
Open Full Playground
171171
<svg className="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">

website/src/components/home/McpSection.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
'use client';
22

3+
import Link from 'next/link';
34
import { FadeIn } from '@/components/ui/FadeIn';
45
import { TerminalMockup } from '@/components/ui/TerminalMockup';
56

@@ -36,13 +37,23 @@ export function McpSection() {
3637
{tools.map((tool) => (
3738
<span
3839
key={tool}
39-
className="text-xs font-mono text-zinc-500 bg-white/[0.03] border border-white/[0.06] rounded-md px-2.5 py-1"
40+
className="text-xs font-mono text-zinc-300 bg-white/[0.03] border border-white/[0.06] rounded-md px-2.5 py-1"
4041
>
4142
{tool}
4243
</span>
4344
))}
4445
</div>
4546
</FadeIn>
47+
<FadeIn delay={0.35}>
48+
<div className="mt-8">
49+
<Link
50+
href="/docs/mcp-guide"
51+
className="text-sm text-accent-indigo hover:underline inline-flex items-center gap-1"
52+
>
53+
Learn more →
54+
</Link>
55+
</div>
56+
</FadeIn>
4657
</div>
4758
</section>
4859
);

website/src/components/home/StatsBar.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { FadeIn } from '@/components/ui/FadeIn';
55
import { AnimatedCounter } from '@/components/ui/AnimatedCounter';
66

77
const stats = [
8-
{ value: 1250000, suffix: '+', label: 'ops/sec', color: 'text-accent-orange' },
8+
{ value: 1380000, suffix: '+', label: 'ops/sec', color: 'text-accent-orange' },
99
{ value: 1, suffix: 'μs', label: 'latency', color: 'text-accent-indigo', prefix: '<' },
1010
{ value: 85, suffix: '%', label: 'SQL-99', color: 'text-accent-green' },
1111
{ value: 6, suffix: '', label: 'Dialects', color: 'text-accent-purple' },
@@ -15,7 +15,7 @@ export function StatsBar() {
1515
return (
1616
<section className="py-20">
1717
<div className="max-w-6xl mx-auto px-4">
18-
<div className="flex flex-wrap justify-center gap-4 md:gap-8">
18+
<div className="grid grid-cols-2 sm:grid-cols-4 gap-4 md:gap-8 justify-items-center">
1919
{stats.map((stat, i) => (
2020
<FadeIn key={stat.label} delay={i * 0.1}>
2121
<GlassCard className="p-6 text-center min-w-[140px]">

0 commit comments

Comments
 (0)