Changelog
-
+
Track every feature, fix, and improvement across GoSQLX releases.
diff --git a/website/src/app/compare/CompareContent.tsx b/website/src/app/compare/CompareContent.tsx
index f141c8cd..9609c227 100644
--- a/website/src/app/compare/CompareContent.tsx
+++ b/website/src/app/compare/CompareContent.tsx
@@ -171,7 +171,7 @@ export function CompareContent() {
Performance comparisons are withheld until a reproducible benchmark harness is published.
For GoSQLX measurements, see the{' '}
-
+
benchmarks page
.
@@ -189,7 +189,7 @@ export function CompareContent() {
Get started in under a minute with a single{' '}
-
+
go get
{' '}
command.
diff --git a/website/src/app/docs/[...slug]/page.tsx b/website/src/app/docs/[...slug]/page.tsx
index a8496628..55693042 100644
--- a/website/src/app/docs/[...slug]/page.tsx
+++ b/website/src/app/docs/[...slug]/page.tsx
@@ -135,7 +135,7 @@ export default async function DocPage({ params }: PageProps) {
{/* Reading time */}
-
+
diff --git a/website/src/app/docs/page.tsx b/website/src/app/docs/page.tsx
index 19657a95..c8f8864b 100644
--- a/website/src/app/docs/page.tsx
+++ b/website/src/app/docs/page.tsx
@@ -34,7 +34,7 @@ export default function DocsPage() {
Get Started
@@ -52,13 +52,13 @@ export default function DocsPage() {
href={`/docs/${group.items[0].slug}`}
className="glass glass-hover block rounded-xl p-6 transition-colors h-full"
>
-
-
+
{group.category}
-
+
{group.items.length} {group.items.length === 1 ? 'article' : 'articles'}
@@ -66,7 +66,7 @@ export default function DocsPage() {
{item.label}
))}
{group.items.length > 3 && (
- +{group.items.length - 3} more
+ +{group.items.length - 3} more
)}
diff --git a/website/src/app/global-error.tsx b/website/src/app/global-error.tsx
index 0eb33572..c9627017 100644
--- a/website/src/app/global-error.tsx
+++ b/website/src/app/global-error.tsx
@@ -15,7 +15,7 @@ export default function GlobalError({
return (
-
+
diff --git a/website/src/app/globals.css b/website/src/app/globals.css
index b8d35bfd..df23bd06 100644
--- a/website/src/app/globals.css
+++ b/website/src/app/globals.css
@@ -1,32 +1,96 @@
@import "tailwindcss";
@plugin "@tailwindcss/typography";
+/* ==========================================================================
+ SEMANTIC DESIGN TOKENS
+ One set of names, two themes. Dark is the default (:root); light mode
+ swaps the raw values on html.light. Every text/UI pair below is checked for
+ WCAG AA (4.5:1 text, 3:1 UI) against --bg, --bg-raised and --bg-overlay.
+ Components use the Tailwind utilities mapped in @theme below
+ (bg-bg, bg-bg-raised, text-fg-muted, border-border, bg-brand, text-accent,
+ ...) and never hardcode hex values.
+ ========================================================================== */
+:root {
+ color-scheme: dark;
+
+ --bg: #0A0A0F; /* page */
+ --bg-raised: #12121A; /* cards, code frame */
+ --bg-overlay: #1A1A24; /* modals, menus, hover */
+
+ --fg: #F0F0F5; /* body and headings */
+ --fg-muted: #A1A1B5; /* secondary text */
+ --fg-subtle: #8B8BA0; /* captions, meta */
+
+ --border: rgba(255, 255, 255, 0.08); /* decorative hairlines */
+
+ --brand: #22C55E; /* primary actions, GoSQLX bars */
+ --brand-fg: #052E16; /* text on brand fills */
+ --accent: #818CF8; /* links, focus ring */
+ --accent-fg: #0A0A0F; /* text on accent fills */
+ --accent-warm: #FB923C; /* sparing highlights */
+
+ --danger: #F87171;
+ --ok: #4ADE80;
+}
+
+html.light {
+ color-scheme: light;
+
+ --bg: #FAFBFC;
+ --bg-raised: #FFFFFF;
+ --bg-overlay: #F1F3F6;
+
+ --fg: #111827;
+ --fg-muted: #4B5563;
+ --fg-subtle: #5B6472;
+
+ --border: #E5E7EB;
+
+ --brand: #15803D;
+ --brand-fg: #FFFFFF;
+ --accent: #4F46E5;
+ --accent-fg: #FFFFFF;
+ --accent-warm: #9A3412;
+
+ --danger: #B91C1C;
+ --ok: #166534;
+}
+
+/* Code blocks stay dark in light mode (standard convention), so restore the
+ dark token values inside them. */
+html.light pre,
+html.light textarea[class*="font-mono"] {
+ --fg: #F0F0F5;
+ --fg-muted: #A1A1B5;
+ --fg-subtle: #8B8BA0;
+ --brand: #22C55E;
+ --accent: #818CF8;
+ --accent-warm: #FB923C;
+ --danger: #F87171;
+ --ok: #4ADE80;
+}
+
+/* `inline` makes each utility reference the runtime variable, so the
+ html.light values above reach every utility without per-class overrides. */
@theme inline {
- /* Existing tokens (backward compat) */
- --color-primary: #09090b;
- --color-surface: #18181b;
- --color-elevated: #27272a;
- --color-accent-indigo: #6366f1;
- --color-accent-orange: #f97316;
- --color-accent-green: #22c55e;
- --color-accent-purple: #a78bfa;
-
- /* Semantic design tokens */
- --color-bg-deep: #0A0A0F;
- --color-bg-surface: #12121A;
- --color-bg-elevated: #1A1A25;
- --color-bg-hover: #22222F;
-
- --color-brand: #22C55E;
- --color-brand-hover: #16A34A;
-
- --color-text-primary: #F0F0F5;
- --color-text-secondary: #9494A8;
- --color-text-muted: #8B8BA0;
- --color-link: #6366F1;
-
- --color-border-default: rgba(255, 255, 255, 0.08);
- --color-border-hover: rgba(255, 255, 255, 0.15);
+ --color-bg: var(--bg);
+ --color-bg-raised: var(--bg-raised);
+ --color-bg-overlay: var(--bg-overlay);
+
+ --color-fg: var(--fg);
+ --color-fg-muted: var(--fg-muted);
+ --color-fg-subtle: var(--fg-subtle);
+
+ --color-border: var(--border);
+
+ --color-brand: var(--brand);
+ --color-brand-fg: var(--brand-fg);
+ --color-accent: var(--accent);
+ --color-accent-fg: var(--accent-fg);
+ --color-accent-warm: var(--accent-warm);
+
+ --color-danger: var(--danger);
+ --color-ok: var(--ok);
--font-sans: var(--font-body), system-ui, sans-serif;
--font-heading: var(--font-heading), system-ui, sans-serif;
@@ -42,8 +106,8 @@ h1, h2, h3, h4, h5, h6 {
}
body {
- background-color: var(--color-primary);
- color: #fafafa;
+ background-color: var(--bg);
+ color: var(--fg);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
overflow-x: clip;
@@ -100,10 +164,18 @@ body {
/* Prose dark theme overrides */
.prose-dark {
- --tw-prose-body: rgba(255,255,255,0.8);
- --tw-prose-headings: #F0F0F5;
- --tw-prose-links: #6366f1;
- --tw-prose-code: #F0F0F5;
+ --tw-prose-body: color-mix(in srgb, var(--fg) 82%, var(--bg));
+ --tw-prose-headings: var(--fg);
+ --tw-prose-links: var(--accent);
+ --tw-prose-bold: var(--fg);
+ --tw-prose-counters: var(--fg-subtle);
+ --tw-prose-bullets: var(--fg-subtle);
+ --tw-prose-quotes: var(--fg);
+ --tw-prose-captions: var(--fg-subtle);
+ --tw-prose-hr: var(--border);
+ --tw-prose-th-borders: var(--border);
+ --tw-prose-td-borders: var(--border);
+ --tw-prose-code: var(--fg);
--tw-prose-pre-bg: #12121A;
}
@@ -114,44 +186,16 @@ body {
We override them here to avoid touching 300+ JSX class strings.
========================================================================== */
-/* --- Design token overrides --- */
-html.light {
- --color-primary: #FAFBFC;
- --color-surface: #FFFFFF;
- --color-elevated: #F3F4F6;
- --color-bg-deep: #FAFBFC;
- --color-bg-surface: #FFFFFF;
- --color-bg-elevated: #F3F4F6;
- --color-bg-hover: #E5E7EB;
- --color-text-primary: #1A1A2E;
- --color-text-secondary: #4B5563;
- --color-text-muted: #5B6472;
- --color-border-default: rgba(0, 0, 0, 0.08);
- --color-border-hover: rgba(0, 0, 0, 0.15);
-}
-
-/* @theme inline bakes token values into utilities, so the html.light variable
- overrides never reach them; override the muted-text utilities explicitly. */
-html.light .text-text-muted,
-html.light .placeholder\:text-text-muted::placeholder {
- color: #5B6472;
-}
-
-/* --- Body --- */
-html.light body {
- background-color: #FAFBFC;
- color: #1A1A2E;
-}
+/* Token-based utilities (bg-bg, text-fg-*, bg-brand, text-accent, ...) need no
+ overrides: they switch through the html.light variables above. The rules
+ below only remain for components that still use raw zinc/slate/white
+ palette classes; delete them as those components move to tokens. */
/* --- Global text color overrides ---
!important needed because Tailwind v4 compiles utilities inside @layer
which wins the CSS cascade over unlayered selectors. */
-html.light .text-white { color: #1A1A2E !important; }
-/* Keep text-white truly white inside accent-colored containers */
-html.light .bg-accent-indigo .text-white,
-html.light .bg-accent-green .text-white,
-html.light .bg-brand .text-white,
-html.light [class*="bg-accent-indigo"].text-white,
+html.light .text-white { color: #111827 !important; }
+/* Keep text-white truly white inside saturated palette fills */
html.light [class*="bg-green-"].text-white,
html.light [class*="bg-indigo-"].text-white { color: #FFFFFF !important; }
html.light .text-zinc-100 { color: #1F2937 !important; }
@@ -202,10 +246,6 @@ html.light [class*="bg-white\\/\\[0\\.1"] { background-color: rgba(0, 0, 0, 0.06
html.light [class*="bg-white\\/5"] { background-color: rgba(0, 0, 0, 0.03) !important; }
html.light [class*="bg-white\\/10"] { background-color: rgba(0, 0, 0, 0.05) !important; }
-/* --- Primary bg (used as bg-primary on mobile menu, etc.) --- */
-html.light .bg-primary { background-color: #FAFBFC !important; }
-html.light .bg-surface { background-color: #FFFFFF !important; }
-
/* --- Slate backgrounds (playground, panels) --- */
html.light .bg-slate-800 { background-color: #E5E7EB !important; }
html.light .bg-slate-900 { background-color: #F3F4F6 !important; }
@@ -308,19 +348,10 @@ html.light select option {
color: #1A1A2E;
}
-/* --- Version badge --- */
-html.light .bg-accent-indigo\\/10 {
- background-color: rgba(99, 102, 241, 0.08);
-}
-html.light .border-accent-indigo\\/30 {
- border-color: rgba(99, 102, 241, 0.25);
-}
-
/* --- Hero background gradients: reduce on light mode --- */
html.light section > [aria-hidden="true"] { opacity: 0.15; }
/* --- Playground: override hardcoded arbitrary bg --- */
-html.light .bg-\[\#09090b\] { background-color: #FAFBFC !important; }
html.light .bg-\[\#0F172A\] { background-color: #FAFBFC !important; }
/* Playground select element */
@@ -357,7 +388,6 @@ html.light pre[class*="font-mono"] {
background-color: #1E1E2E;
color: #D4D4D8;
}
-html.light code { color: inherit; }
/* Code in MiniPlayground, hero, etc. — keep dark code blocks */
html.light .font-mono[class*="text-zinc-300"],
@@ -376,32 +406,12 @@ html.light pre .text-zinc-300,
html.light pre .text-zinc-400 {
color: inherit !important;
}
-html.light pre .text-accent-green { color: #22C55E !important; }
-html.light pre .text-accent-orange { color: #F97316 !important; }
-
-/* Accent colors on code stay vivid */
-html.light pre .text-accent-green,
-html.light pre .text-accent-orange,
-html.light textarea .text-accent-green,
-html.light textarea .text-accent-orange {
- color: inherit;
-}
-
-/* --- Stats / accent-colored numbers --- */
-html.light .text-accent-orange { color: #EA580C !important; }
-html.light .text-accent-green { color: #16A34A !important; }
-html.light .text-accent-indigo { color: #4F46E5 !important; }
-html.light .text-accent-purple { color: #7C3AED !important; }
/* --- Section borders --- */
html.light section[class*="border-t"] { border-color: rgba(0, 0, 0, 0.06) !important; }
html.light [class*="border-b"][class*="border-white"] { border-color: rgba(0, 0, 0, 0.06) !important; }
/* --- Feature card icon tinted backgrounds --- */
-html.light [class*="bg-accent-purple\\/10"] { background-color: rgba(124, 58, 237, 0.08) !important; }
-html.light [class*="bg-accent-green\\/10"] { background-color: rgba(22, 163, 74, 0.08) !important; }
-html.light [class*="bg-accent-orange\\/10"] { background-color: rgba(234, 88, 12, 0.08) !important; }
-html.light [class*="bg-accent-indigo\\/10"] { background-color: rgba(79, 70, 229, 0.08) !important; }
html.light [class*="bg-red-500\\/10"] { background-color: rgba(220, 38, 38, 0.08) !important; }
html.light [class*="bg-cyan-500\\/10"] { background-color: rgba(6, 182, 212, 0.08) !important; }
@@ -418,10 +428,6 @@ html.light ::-webkit-scrollbar-thumb:hover { background: rgba(0, 0, 0, 0.2); }
/* --- Prose / docs --- */
html.light .prose-dark {
- --tw-prose-body: rgba(0, 0, 0, 0.75);
- --tw-prose-headings: #1A1A2E;
- --tw-prose-links: #4F46E5;
- --tw-prose-code: #1A1A2E;
--tw-prose-pre-bg: #1E1E2E;
}
@@ -461,10 +467,9 @@ html.light .opacity-40[class*="bg-gradient"] { opacity: 0.2; }
/* Keyboard focus ring (unlayered so it wins over utility resets) */
:focus-visible {
- outline: 2px solid var(--color-link);
+ outline: 2px solid var(--accent);
outline-offset: 2px;
}
-html.light :focus-visible { outline-color: #4F46E5; }
/* Respect prefers-reduced-motion for all animations */
@media (prefers-reduced-motion: reduce) {
@@ -495,19 +500,15 @@ html.light :focus-visible { outline-color: #4F46E5; }
/* Inline code in docs prose: no typography backticks, pill styling */
.prose-dark :not(pre) > code {
border-radius: 0.25rem;
- background: rgba(255, 255, 255, 0.1);
+ background: color-mix(in srgb, var(--fg) 8%, transparent);
padding: 0.125rem 0.375rem;
font-size: 0.875em;
- color: #e4e4e7;
+ color: var(--fg);
}
.prose-dark :not(pre) > code::before,
.prose-dark :not(pre) > code::after {
content: none;
}
-html.light .prose-dark :not(pre) > code {
- background: rgba(0, 0, 0, 0.06);
- color: #1f2937;
-}
/* Skip rendering offscreen code blocks and tables on long docs pages. */
.prose pre,
diff --git a/website/src/app/playground/page.tsx b/website/src/app/playground/page.tsx
index 09381d82..e56797b8 100644
--- a/website/src/app/playground/page.tsx
+++ b/website/src/app/playground/page.tsx
@@ -21,11 +21,11 @@ export default function PlaygroundPage() {
crossOrigin="anonymous"
/>
-
-
+
+
Online Go SQL Parser Playground
-
+
Parse, format, lint, and analyze SQL right in your browser with
GoSQLX compiled to WebAssembly. Pick a dialect (PostgreSQL, MySQL,
SQL Server, Oracle, SQLite, Snowflake, ClickHouse), paste a query, and
diff --git a/website/src/app/vscode/VscodeContent.tsx b/website/src/app/vscode/VscodeContent.tsx
index 087455af..f9e71d4d 100644
--- a/website/src/app/vscode/VscodeContent.tsx
+++ b/website/src/app/vscode/VscodeContent.tsx
@@ -99,7 +99,7 @@ export function VscodeContent() {
role="region"
aria-label="Key Settings JSON"
tabIndex={0}
- className="font-mono text-sm text-zinc-300 whitespace-pre overflow-x-auto"
+ className="font-mono text-sm text-fg whitespace-pre overflow-x-auto"
>
{`{
"gosqlx.executablePath": "/usr/local/bin/gosqlx",
diff --git a/website/src/components/benchmarks/BarChart.tsx b/website/src/components/benchmarks/BarChart.tsx
index 7cb963b6..ff50bfb5 100644
--- a/website/src/components/benchmarks/BarChart.tsx
+++ b/website/src/components/benchmarks/BarChart.tsx
@@ -62,7 +62,7 @@ export function BarChart({ data, unit = 'ops/sec' }: BarChartProps) {
{item.label}
{item.highlight && (
-
+
GoSQLX
)}
diff --git a/website/src/components/benchmarks/RawDataToggle.tsx b/website/src/components/benchmarks/RawDataToggle.tsx
index a1261e3d..57737636 100644
--- a/website/src/components/benchmarks/RawDataToggle.tsx
+++ b/website/src/components/benchmarks/RawDataToggle.tsx
@@ -11,7 +11,7 @@ export function RawDataToggle({ id, children }: { id: string; children: React.Re
setOpen((prev) => !prev)}
- className="text-xs text-text-muted hover:text-zinc-300 transition-colors flex items-center gap-1"
+ className="text-xs text-fg-subtle hover:text-zinc-300 transition-colors flex items-center gap-1"
aria-expanded={open}
aria-controls={panelId}
>
diff --git a/website/src/components/docs/CopyButton.tsx b/website/src/components/docs/CopyButton.tsx
index 4ae7be13..9f857a85 100644
--- a/website/src/components/docs/CopyButton.tsx
+++ b/website/src/components/docs/CopyButton.tsx
@@ -38,7 +38,7 @@ export function CopyButton({ text }: { text: string }) {
className="block"
>
{copied ? (
-
+
) : failed ? (
diff --git a/website/src/components/docs/DocNavigation.tsx b/website/src/components/docs/DocNavigation.tsx
index 626214e3..86f405a2 100644
--- a/website/src/components/docs/DocNavigation.tsx
+++ b/website/src/components/docs/DocNavigation.tsx
@@ -18,7 +18,7 @@ export function DocNavigation({ prev, next }: DocNavigationProps) {
href={`/docs/${prev.slug}`}
className="glass glass-hover group flex flex-col gap-2 rounded-xl p-5 transition-all"
>
-
+
Previous
@@ -42,7 +42,7 @@ export function DocNavigation({ prev, next }: DocNavigationProps) {
href={`/docs/${next.slug}`}
className="glass glass-hover group flex flex-col items-end gap-2 rounded-xl p-5 text-right transition-all"
>
-
+
Next
diff --git a/website/src/components/docs/DocsSearchTrigger.tsx b/website/src/components/docs/DocsSearchTrigger.tsx
index a40a22f8..035b27b4 100644
--- a/website/src/components/docs/DocsSearchTrigger.tsx
+++ b/website/src/components/docs/DocsSearchTrigger.tsx
@@ -16,7 +16,7 @@ export function DocsSearchTrigger() {
Search documentation...
-
+
⌘K
diff --git a/website/src/components/docs/Sidebar.tsx b/website/src/components/docs/Sidebar.tsx
index f76546c8..ef2c5baa 100644
--- a/website/src/components/docs/Sidebar.tsx
+++ b/website/src/components/docs/Sidebar.tsx
@@ -61,7 +61,7 @@ export function Sidebar() {
aria-current={isActive(item.slug) ? 'page' : undefined}
className={`flex items-center rounded-md px-3 py-1.5 max-lg:min-h-11 text-sm transition-colors ${
isActive(item.slug)
- ? 'border-l-2 border-accent-indigo bg-accent-indigo/10 pl-[10px] text-white font-medium'
+ ? 'border-l-2 border-accent bg-accent/10 pl-[10px] text-white font-medium'
: 'border-l-2 border-transparent pl-[10px] text-zinc-400 hover:text-white hover:bg-white/5'
}`}
>
@@ -81,7 +81,7 @@ export function Sidebar() {
{/* Mobile toggle */}
setMobileOpen(!mobileOpen)}
- className="fixed bottom-4 right-4 z-50 flex h-12 w-12 items-center justify-center rounded-full bg-accent-indigo text-white shadow-lg lg:hidden"
+ className="fixed bottom-4 right-4 z-50 flex h-12 w-12 items-center justify-center rounded-full bg-accent text-accent-fg shadow-lg lg:hidden"
aria-label="Toggle docs sidebar"
>
@@ -100,7 +100,7 @@ export function Sidebar() {
{/* Sidebar */}
diff --git a/website/src/components/docs/Toc.tsx b/website/src/components/docs/Toc.tsx
index a003c6c4..b0d8da39 100644
--- a/website/src/components/docs/Toc.tsx
+++ b/website/src/components/docs/Toc.tsx
@@ -38,7 +38,7 @@ export function Toc({ headings }: TocProps) {
return (
-
+
On this page
@@ -53,7 +53,7 @@ export function Toc({ headings }: TocProps) {
activeId === heading.id
? 'text-white font-medium'
: heading.level === 3
- ? 'text-text-muted hover:text-zinc-300'
+ ? 'text-fg-subtle hover:text-zinc-300'
: 'text-zinc-400 hover:text-zinc-300'
}`}
>
diff --git a/website/src/components/docs/mdx-components.tsx b/website/src/components/docs/mdx-components.tsx
index 5158d5d0..21fdc688 100644
--- a/website/src/components/docs/mdx-components.tsx
+++ b/website/src/components/docs/mdx-components.tsx
@@ -13,7 +13,7 @@ function HeadingAnchor({ id, level, children }: { id?: string; level: number; ch
'a',
{
href: `#${id}`,
- className: 'ml-2 text-text-muted opacity-0 transition-opacity group-hover:opacity-100',
+ className: 'ml-2 text-fg-subtle opacity-0 transition-opacity group-hover:opacity-100',
'aria-label': 'Link to heading',
},
'#'
@@ -31,7 +31,7 @@ export const mdxComponents = {
h6: (props: ComponentPropsWithoutRef<'h6'>) => ,
a: (props: ComponentPropsWithoutRef<'a'>) => (
-
+
),
pre: ({ children, ...props }: ComponentPropsWithoutRef<'pre'>) => {
@@ -52,7 +52,7 @@ export const mdxComponents = {
{children}
@@ -66,7 +66,7 @@ export const mdxComponents = {
},
blockquote: (props: ComponentPropsWithoutRef<'blockquote'>) => (
-
+
),
table: (props: ComponentPropsWithoutRef<'table'>) => (
diff --git a/website/src/components/home/CodeExamples.tsx b/website/src/components/home/CodeExamples.tsx
index e147bcf4..786b243f 100644
--- a/website/src/components/home/CodeExamples.tsx
+++ b/website/src/components/home/CodeExamples.tsx
@@ -12,14 +12,14 @@ const tabs: { label: string; lines: CodeLine[] }[] = [
{
label: 'Parse',
lines: [
- [{ text: 'package', cls: 'text-accent-indigo' }, { text: ' main', cls: 'text-white' }],
+ [{ text: 'package', cls: 'text-accent' }, { text: ' main', cls: 'text-white' }],
[],
- [{ text: 'import', cls: 'text-accent-indigo' }, { text: ' ', cls: '' }, { text: '"github.com/ajitpratap0/GoSQLX/pkg/gosqlx"', cls: 'text-accent-green' }],
+ [{ text: 'import', cls: 'text-accent' }, { text: ' ', cls: '' }, { text: '"github.com/ajitpratap0/GoSQLX/pkg/gosqlx"', cls: 'text-brand' }],
[],
- [{ text: 'func', cls: 'text-accent-indigo' }, { text: ' main', cls: 'text-accent-orange' }, { text: '() {', cls: 'text-zinc-300' }],
- [{ text: ' ', cls: '' }, { text: '// Parse SQL into an AST', cls: 'text-text-muted' }],
- [{ text: ' ast, err := gosqlx.', cls: 'text-zinc-300' }, { text: 'Parse', cls: 'text-accent-orange' }, { text: '(', cls: 'text-zinc-300' }, { text: '"SELECT * FROM users WHERE active = true"', cls: 'text-accent-green' }, { text: ')', cls: 'text-zinc-300' }],
- [{ text: ' ', cls: '' }, { text: 'if', cls: 'text-accent-indigo' }, { text: ' err != nil {', cls: 'text-zinc-300' }],
+ [{ text: 'func', cls: 'text-accent' }, { text: ' main', cls: 'text-accent-warm' }, { text: '() {', cls: 'text-zinc-300' }],
+ [{ text: ' ', cls: '' }, { text: '// Parse SQL into an AST', cls: 'text-fg-subtle' }],
+ [{ text: ' ast, err := gosqlx.', cls: 'text-zinc-300' }, { text: 'Parse', cls: 'text-accent-warm' }, { text: '(', cls: 'text-zinc-300' }, { text: '"SELECT * FROM users WHERE active = true"', cls: 'text-brand' }, { text: ')', cls: 'text-zinc-300' }],
+ [{ text: ' ', cls: '' }, { text: 'if', cls: 'text-accent' }, { text: ' err != nil {', cls: 'text-zinc-300' }],
[{ text: ' log.Fatal(err)', cls: 'text-zinc-300' }],
[{ text: ' }', cls: 'text-zinc-300' }],
[{ text: ' fmt.Println(ast.Statements)', cls: 'text-zinc-300' }],
@@ -29,14 +29,14 @@ const tabs: { label: string; lines: CodeLine[] }[] = [
{
label: 'Format',
lines: [
- [{ text: 'package', cls: 'text-accent-indigo' }, { text: ' main', cls: 'text-white' }],
+ [{ text: 'package', cls: 'text-accent' }, { text: ' main', cls: 'text-white' }],
[],
- [{ text: 'import', cls: 'text-accent-indigo' }, { text: ' ', cls: '' }, { text: '"github.com/ajitpratap0/GoSQLX/pkg/gosqlx"', cls: 'text-accent-green' }],
+ [{ text: 'import', cls: 'text-accent' }, { text: ' ', cls: '' }, { text: '"github.com/ajitpratap0/GoSQLX/pkg/gosqlx"', cls: 'text-brand' }],
[],
- [{ text: 'func', cls: 'text-accent-indigo' }, { text: ' main', cls: 'text-accent-orange' }, { text: '() {', cls: 'text-zinc-300' }],
- [{ text: ' ', cls: '' }, { text: '// Format messy SQL', cls: 'text-text-muted' }],
- [{ text: ' formatted, err := gosqlx.', cls: 'text-zinc-300' }, { text: 'Format', cls: 'text-accent-orange' }, { text: '(', cls: 'text-zinc-300' }, { text: '"select id,name from users where id>5"', cls: 'text-accent-green' }, { text: ')', cls: 'text-zinc-300' }],
- [{ text: ' ', cls: '' }, { text: 'if', cls: 'text-accent-indigo' }, { text: ' err != nil {', cls: 'text-zinc-300' }],
+ [{ text: 'func', cls: 'text-accent' }, { text: ' main', cls: 'text-accent-warm' }, { text: '() {', cls: 'text-zinc-300' }],
+ [{ text: ' ', cls: '' }, { text: '// Format messy SQL', cls: 'text-fg-subtle' }],
+ [{ text: ' formatted, err := gosqlx.', cls: 'text-zinc-300' }, { text: 'Format', cls: 'text-accent-warm' }, { text: '(', cls: 'text-zinc-300' }, { text: '"select id,name from users where id>5"', cls: 'text-brand' }, { text: ')', cls: 'text-zinc-300' }],
+ [{ text: ' ', cls: '' }, { text: 'if', cls: 'text-accent' }, { text: ' err != nil {', cls: 'text-zinc-300' }],
[{ text: ' log.Fatal(err)', cls: 'text-zinc-300' }],
[{ text: ' }', cls: 'text-zinc-300' }],
[{ text: ' fmt.Println(formatted)', cls: 'text-zinc-300' }],
@@ -46,15 +46,15 @@ const tabs: { label: string; lines: CodeLine[] }[] = [
{
label: 'Validate',
lines: [
- [{ text: 'package', cls: 'text-accent-indigo' }, { text: ' main', cls: 'text-white' }],
+ [{ text: 'package', cls: 'text-accent' }, { text: ' main', cls: 'text-white' }],
[],
- [{ text: 'import', cls: 'text-accent-indigo' }, { text: ' ', cls: '' }, { text: '"github.com/ajitpratap0/GoSQLX/pkg/gosqlx"', cls: 'text-accent-green' }],
+ [{ text: 'import', cls: 'text-accent' }, { text: ' ', cls: '' }, { text: '"github.com/ajitpratap0/GoSQLX/pkg/gosqlx"', cls: 'text-brand' }],
[],
- [{ text: 'func', cls: 'text-accent-indigo' }, { text: ' main', cls: 'text-accent-orange' }, { text: '() {', cls: 'text-zinc-300' }],
- [{ text: ' ', cls: '' }, { text: '// Validate SQL syntax', cls: 'text-text-muted' }],
- [{ text: ' result := gosqlx.', cls: 'text-zinc-300' }, { text: 'Validate', cls: 'text-accent-orange' }, { text: '(', cls: 'text-zinc-300' }, { text: '"SELECT * FROM users"', cls: 'text-accent-green' }, { text: ')', cls: 'text-zinc-300' }],
- [{ text: ' ', cls: '' }, { text: 'if', cls: 'text-accent-indigo' }, { text: ' result.Valid {', cls: 'text-zinc-300' }],
- [{ text: ' fmt.Println(', cls: 'text-zinc-300' }, { text: '"SQL is valid!"', cls: 'text-accent-green' }, { text: ')', cls: 'text-zinc-300' }],
+ [{ text: 'func', cls: 'text-accent' }, { text: ' main', cls: 'text-accent-warm' }, { text: '() {', cls: 'text-zinc-300' }],
+ [{ text: ' ', cls: '' }, { text: '// Validate SQL syntax', cls: 'text-fg-subtle' }],
+ [{ text: ' result := gosqlx.', cls: 'text-zinc-300' }, { text: 'Validate', cls: 'text-accent-warm' }, { text: '(', cls: 'text-zinc-300' }, { text: '"SELECT * FROM users"', cls: 'text-brand' }, { text: ')', cls: 'text-zinc-300' }],
+ [{ text: ' ', cls: '' }, { text: 'if', cls: 'text-accent' }, { text: ' result.Valid {', cls: 'text-zinc-300' }],
+ [{ text: ' fmt.Println(', cls: 'text-zinc-300' }, { text: '"SQL is valid!"', cls: 'text-brand' }, { text: ')', cls: 'text-zinc-300' }],
[{ text: ' }', cls: 'text-zinc-300' }],
[{ text: '}', cls: 'text-zinc-300' }],
],
@@ -62,19 +62,19 @@ const tabs: { label: string; lines: CodeLine[] }[] = [
{
label: 'Lint',
lines: [
- [{ text: 'package', cls: 'text-accent-indigo' }, { text: ' main', cls: 'text-white' }],
+ [{ text: 'package', cls: 'text-accent' }, { text: ' main', cls: 'text-white' }],
[],
- [{ text: 'import', cls: 'text-accent-indigo' }, { text: ' ', cls: '' }, { text: '"github.com/ajitpratap0/GoSQLX/pkg/gosqlx"', cls: 'text-accent-green' }],
+ [{ text: 'import', cls: 'text-accent' }, { text: ' ', cls: '' }, { text: '"github.com/ajitpratap0/GoSQLX/pkg/gosqlx"', cls: 'text-brand' }],
[],
- [{ text: 'func', cls: 'text-accent-indigo' }, { text: ' main', cls: 'text-accent-orange' }, { text: '() {', cls: 'text-zinc-300' }],
- [{ text: ' ', cls: '' }, { text: '// Lint SQL for best practices', cls: 'text-text-muted' }],
- [{ text: ' issues, err := gosqlx.', cls: 'text-zinc-300' }, { text: 'Lint', cls: 'text-accent-orange' }, { text: '(', cls: 'text-zinc-300' }, { text: '"SELECT * FROM orders"', cls: 'text-accent-green' }, { text: ')', cls: 'text-zinc-300' }],
- [{ text: ' ', cls: '' }, { text: 'if', cls: 'text-accent-indigo' }, { text: ' err != nil {', cls: 'text-zinc-300' }],
+ [{ text: 'func', cls: 'text-accent' }, { text: ' main', cls: 'text-accent-warm' }, { text: '() {', cls: 'text-zinc-300' }],
+ [{ text: ' ', cls: '' }, { text: '// Lint SQL for best practices', cls: 'text-fg-subtle' }],
+ [{ text: ' issues, err := gosqlx.', cls: 'text-zinc-300' }, { text: 'Lint', cls: 'text-accent-warm' }, { text: '(', cls: 'text-zinc-300' }, { text: '"SELECT * FROM orders"', cls: 'text-brand' }, { text: ')', cls: 'text-zinc-300' }],
+ [{ text: ' ', cls: '' }, { text: 'if', cls: 'text-accent' }, { text: ' err != nil {', cls: 'text-zinc-300' }],
[{ text: ' log.Fatal(err)', cls: 'text-zinc-300' }],
[{ text: ' }', cls: 'text-zinc-300' }],
[],
- [{ text: ' ', cls: '' }, { text: 'for', cls: 'text-accent-indigo' }, { text: ' _, issue := ', cls: 'text-zinc-300' }, { text: 'range', cls: 'text-accent-indigo' }, { text: ' issues {', cls: 'text-zinc-300' }],
- [{ text: ' fmt.Printf(', cls: 'text-zinc-300' }, { text: '"%s: %s\\n"', cls: 'text-accent-green' }, { text: ', issue.Code, issue.Message)', cls: 'text-zinc-300' }],
+ [{ text: ' ', cls: '' }, { text: 'for', cls: 'text-accent' }, { text: ' _, issue := ', cls: 'text-zinc-300' }, { text: 'range', cls: 'text-accent' }, { text: ' issues {', cls: 'text-zinc-300' }],
+ [{ text: ' fmt.Printf(', cls: 'text-zinc-300' }, { text: '"%s: %s\\n"', cls: 'text-brand' }, { text: ', issue.Code, issue.Message)', cls: 'text-zinc-300' }],
[{ text: ' }', cls: 'text-zinc-300' }],
[{ text: '}', cls: 'text-zinc-300' }],
],
@@ -84,7 +84,7 @@ const tabs: { label: string; lines: CodeLine[] }[] = [
function renderCode(lines: CodeLine[]) {
return lines.map((line, idx) => (
-
{idx + 1}
+
{idx + 1}
{line.length === 0
? <> >
@@ -119,13 +119,13 @@ export function CodeExamples() {
setSwitched(true);
}}
className={`relative px-4 py-2 text-sm font-medium rounded-t-lg transition-colors ${
- active === i ? 'text-white' : 'text-text-muted hover:text-zinc-300'
+ active === i ? 'text-white' : 'text-fg-subtle hover:text-zinc-300'
}`}
>
{tab.label}
@@ -137,7 +137,7 @@ export function CodeExamples() {
- main.go
+ main.go
{/* Gradient mesh background */}
diff --git a/website/src/components/home/DialectShowcase.tsx b/website/src/components/home/DialectShowcase.tsx
index 593dc3be..ed7aa575 100644
--- a/website/src/components/home/DialectShowcase.tsx
+++ b/website/src/components/home/DialectShowcase.tsx
@@ -5,7 +5,6 @@ import { FadeIn } from '@/components/ui/FadeIn';
interface Dialect {
name: string;
abbr: string;
- color: string;
bgColor: string;
compliance: number;
detail?: string;
@@ -13,28 +12,28 @@ interface Dialect {
}
const DIALECTS: Dialect[] = [
- { name: 'PostgreSQL', abbr: 'PG', color: 'text-blue-400', bgColor: 'bg-blue-500/20', compliance: 95, status: 'Excellent' },
- { name: 'MySQL', abbr: 'My', color: 'text-orange-400', bgColor: 'bg-orange-500/20', compliance: 95, status: 'Excellent' },
- { name: 'MariaDB', abbr: 'Ma', color: 'text-sky-400', bgColor: 'bg-sky-500/20', compliance: 95, status: 'Excellent' },
- { name: 'SQL Server', abbr: 'MS', color: 'text-red-400', bgColor: 'bg-red-500/20', compliance: 85, status: 'Very Good' },
- { name: 'Oracle', abbr: 'Or', color: 'text-rose-400', bgColor: 'bg-rose-500/20', compliance: 80, status: 'Good' },
- { name: 'SQLite', abbr: 'SL', color: 'text-emerald-400', bgColor: 'bg-emerald-500/20', compliance: 85, status: 'Very Good' },
- { name: 'Snowflake', abbr: 'SF', color: 'text-cyan-400', bgColor: 'bg-cyan-500/20', compliance: Math.round((QA_CORPUS.snowflake.pass / QA_CORPUS.snowflake.total) * 100), detail: `${QA_CORPUS.snowflake.pass}/${QA_CORPUS.snowflake.total} QA`, status: 'Excellent' },
- { name: 'ClickHouse', abbr: 'CH', color: 'text-yellow-400', bgColor: 'bg-yellow-500/20', compliance: Math.round((QA_CORPUS.clickhouse.pass / QA_CORPUS.clickhouse.total) * 100), detail: `${QA_CORPUS.clickhouse.pass}/${QA_CORPUS.clickhouse.total} QA`, status: 'Good' },
+ { name: 'PostgreSQL', abbr: 'PG', bgColor: 'bg-blue-500/20', compliance: 95, status: 'Excellent' },
+ { name: 'MySQL', abbr: 'My', bgColor: 'bg-orange-500/20', compliance: 95, status: 'Excellent' },
+ { name: 'MariaDB', abbr: 'Ma', bgColor: 'bg-sky-500/20', compliance: 95, status: 'Excellent' },
+ { name: 'SQL Server', abbr: 'MS', bgColor: 'bg-red-500/20', compliance: 85, status: 'Very Good' },
+ { name: 'Oracle', abbr: 'Or', bgColor: 'bg-rose-500/20', compliance: 80, status: 'Good' },
+ { name: 'SQLite', abbr: 'SL', bgColor: 'bg-emerald-500/20', compliance: 85, status: 'Very Good' },
+ { name: 'Snowflake', abbr: 'SF', bgColor: 'bg-cyan-500/20', compliance: Math.round((QA_CORPUS.snowflake.pass / QA_CORPUS.snowflake.total) * 100), detail: `${QA_CORPUS.snowflake.pass}/${QA_CORPUS.snowflake.total} QA`, status: 'Excellent' },
+ { name: 'ClickHouse', abbr: 'CH', bgColor: 'bg-yellow-500/20', compliance: Math.round((QA_CORPUS.clickhouse.pass / QA_CORPUS.clickhouse.total) * 100), detail: `${QA_CORPUS.clickhouse.pass}/${QA_CORPUS.clickhouse.total} QA`, status: 'Good' },
];
const statusColors: Record
= {
- 'Excellent': 'bg-green-500/15 text-green-400 border-green-500/20',
- 'Very Good': 'bg-blue-500/15 text-blue-400 border-blue-500/20',
- 'Good': 'bg-yellow-500/15 text-yellow-400 border-yellow-500/20',
- 'In Progress': 'bg-zinc-500/15 text-zinc-400 border-zinc-500/20',
+ 'Excellent': 'bg-ok/10 text-ok border-ok/20',
+ 'Very Good': 'bg-accent/10 text-accent border-accent/20',
+ 'Good': 'bg-accent-warm/10 text-accent-warm border-accent-warm/20',
+ 'In Progress': 'bg-fg-subtle/10 text-fg-subtle border-border',
};
function complianceColor(pct: number): string {
- if (pct >= 95) return 'text-green-400';
- if (pct >= 85) return 'text-blue-400';
- if (pct >= 80) return 'text-yellow-400';
- return 'text-zinc-400';
+ if (pct >= 95) return 'text-ok';
+ if (pct >= 85) return 'text-accent';
+ if (pct >= 80) return 'text-accent-warm';
+ return 'text-fg-subtle';
}
export function DialectShowcase() {
@@ -54,7 +53,7 @@ export function DialectShowcase() {
{dialect.abbr}
@@ -65,7 +64,7 @@ export function DialectShowcase() {
{dialect.compliance}%
{dialect.detail && (
- {dialect.detail}
+ {dialect.detail}
)}
= {
};
const colorMap: Record = {
- 'accent-purple': 'bg-accent-purple/10 text-accent-purple',
- 'accent-green': 'bg-accent-green/10 text-accent-green',
- 'accent-orange': 'bg-accent-orange/10 text-accent-orange',
- 'accent-indigo': 'bg-accent-indigo/10 text-accent-indigo',
- 'red': 'bg-red-500/10 text-red-400',
+ 'brand': 'bg-brand/10 text-brand',
+ 'accent-warm': 'bg-accent-warm/10 text-accent-warm',
+ 'accent': 'bg-accent/10 text-accent',
+ 'danger': 'bg-danger/10 text-danger',
'cyan': 'bg-cyan-500/10 text-cyan-400',
};
diff --git a/website/src/components/home/McpSection.tsx b/website/src/components/home/McpSection.tsx
index 51773faf..0a357cf1 100644
--- a/website/src/components/home/McpSection.tsx
+++ b/website/src/components/home/McpSection.tsx
@@ -47,7 +47,7 @@ export function McpSection() {
Learn more →
diff --git a/website/src/components/home/MiniPlayground.tsx b/website/src/components/home/MiniPlayground.tsx
index 1cc6d27c..11ac7331 100644
--- a/website/src/components/home/MiniPlayground.tsx
+++ b/website/src/components/home/MiniPlayground.tsx
@@ -151,7 +151,7 @@ export function MiniPlayground() {
onChange={handleSqlChange}
spellCheck={false}
aria-label="SQL query input"
- className="w-full p-4 text-[14px] leading-relaxed font-mono bg-transparent resize-none max-h-[320px] min-h-[200px] focus:outline-none focus:ring-2 focus:ring-accent-indigo/50 overflow-auto"
+ className="w-full p-4 text-[14px] leading-relaxed font-mono bg-transparent resize-none max-h-[320px] min-h-[200px] focus:outline-none focus:ring-2 focus:ring-accent/50 overflow-auto"
style={{ color: '#D4D4D8' }}
rows={12}
/>
@@ -182,7 +182,7 @@ export function MiniPlayground() {
))}
-
+
{!wasmRequested
? 'Precomputed sample output'
: loading
@@ -212,7 +212,7 @@ export function MiniPlayground() {
Open Full Playground →
diff --git a/website/src/components/home/PerformanceSection.tsx b/website/src/components/home/PerformanceSection.tsx
index 6e7b7b79..72a86d8e 100644
--- a/website/src/components/home/PerformanceSection.tsx
+++ b/website/src/components/home/PerformanceSection.tsx
@@ -16,10 +16,10 @@ interface Stat {
}
const stats: Stat[] = [
- { value: HEADLINE_OPS_PER_SEC, suffix: '', label: `parses/sec (simple SELECT, parse stage, ${BENCH_ENV.hardware})`, color: 'text-accent-orange', prefix: '~' },
- { value: PARSE_BENCHMARKS[0].nsPerOp, suffix: 'ns', label: 'parse latency (simple SELECT, parse stage)', color: 'text-accent-indigo' },
- { text: PROJECT.sql99, label: 'SQL-99 compliance (estimated)', color: 'text-accent-green' },
- { value: PROJECT.dialectCount, suffix: '', label: 'Dialects', color: 'text-accent-purple' },
+ { value: HEADLINE_OPS_PER_SEC, suffix: '', label: `parses/sec (simple SELECT, parse stage, ${BENCH_ENV.hardware})`, color: 'text-accent-warm', prefix: '~' },
+ { value: PARSE_BENCHMARKS[0].nsPerOp, suffix: 'ns', label: 'parse latency (simple SELECT, parse stage)', color: 'text-accent' },
+ { text: PROJECT.sql99, label: 'SQL-99 compliance (estimated)', color: 'text-brand' },
+ { value: PROJECT.dialectCount, suffix: '', label: 'Dialects', color: 'text-accent' },
];
const benchmarks = PARSE_BENCHMARKS.map((b) => ({
diff --git a/website/src/components/home/VscodeSection.tsx b/website/src/components/home/VscodeSection.tsx
index ff4778d1..47f11850 100644
--- a/website/src/components/home/VscodeSection.tsx
+++ b/website/src/components/home/VscodeSection.tsx
@@ -38,49 +38,49 @@ export function VscodeSection() {
-
query.sql — GoSQLX
+
query.sql — GoSQLX
{/* Editor content */}
- 1
+ 1
- SELECT
+ SELECT
u.id, u.name, u.email
- 2
+ 2
- FROM
- users
+ FROM
+ users
u
- 3
+ 3
- JOIN
- orders
+ JOIN
+ orders
o
- ON
+ ON
o.user_id = u.id
- 4
+ 4
- WHERE
+ WHERE
u.active =
- true
+ true
- 5
+ 5
- ORDER BY
+ ORDER BY
u.name
- ASC
+ ASC
;
@@ -88,16 +88,16 @@ export function VscodeSection() {
{/* Status bar */}
-
+
Valid SQL
- |
- PostgreSQL
+ |
+ PostgreSQL
-
0 issues
+
0 issues
diff --git a/website/src/components/layout/Footer.tsx b/website/src/components/layout/Footer.tsx
index a97cc6aa..dc9ad9d9 100644
--- a/website/src/components/layout/Footer.tsx
+++ b/website/src/components/layout/Footer.tsx
@@ -33,7 +33,7 @@ export function Footer() {
{/* Gradient accent line */}
-
+
diff --git a/website/src/components/layout/Navbar.tsx b/website/src/components/layout/Navbar.tsx
index de33a98a..ae2da85e 100644
--- a/website/src/components/layout/Navbar.tsx
+++ b/website/src/components/layout/Navbar.tsx
@@ -53,18 +53,10 @@ export function Navbar() {
const [searchLoaded, setSearchLoaded] = useState(false);
if (searchOpen && !searchLoaded) setSearchLoaded(true);
const { scrollY } = useScroll();
- const [isLight, setIsLight] = useState(false);
- useEffect(() => {
- const check = () => setIsLight(document.documentElement.classList.contains('light'));
- check();
- const observer = new MutationObserver(check);
- observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });
- return () => observer.disconnect();
- }, []);
-
const bgOpacity = useTransform(scrollY, [0, 100], [0.6, 0.9]);
const blurAmount = useTransform(scrollY, [0, 100], [8, 16]);
- const bgColor = useTransform(bgOpacity, (v) => isLight ? `rgba(250, 251, 252, ${v})` : `rgba(9, 9, 11, ${v})`);
+ // Token-based so it follows the theme without tracking the html class.
+ const bgColor = useTransform(bgOpacity, (v) => `color-mix(in srgb, var(--bg) ${Math.round(v * 100)}%, transparent)`);
const blur = useTransform(blurAmount, (v) => `blur(${v}px)`);
// Close mobile menu on resize
@@ -97,7 +89,7 @@ export function Navbar() {
{/* Logo */}
-
GoSQLX
+
GoSQLX
{/* Desktop nav links */}
@@ -130,7 +122,7 @@ export function Navbar() {
Search
-
⌘K
+
⌘K
{NAV_LINKS.map((link) => {
diff --git a/website/src/components/playground/AnalyzeTab.tsx b/website/src/components/playground/AnalyzeTab.tsx
index a49ad3ef..47fc102b 100644
--- a/website/src/components/playground/AnalyzeTab.tsx
+++ b/website/src/components/playground/AnalyzeTab.tsx
@@ -32,9 +32,9 @@ interface AnalyzeTabProps {
}
function scoreColor(score: number): string {
- if (score >= 80) return "text-green-400";
+ if (score >= 80) return "text-ok";
if (score >= 50) return "text-yellow-400";
- return "text-red-400";
+ return "text-danger";
}
function scoreBg(score: number): string {
@@ -80,7 +80,7 @@ export default function AnalyzeTab({ data }: AnalyzeTabProps) {
return (
-
+
diff --git a/website/src/components/playground/AstTab.tsx b/website/src/components/playground/AstTab.tsx
index 61226f3c..c9effc47 100644
--- a/website/src/components/playground/AstTab.tsx
+++ b/website/src/components/playground/AstTab.tsx
@@ -10,9 +10,9 @@ interface AstNodeProps {
function TypeBadge({ type }: { type: string }) {
const colors: Record
= {
Select: "bg-blue-500/20 text-blue-400 border-blue-500/30",
- Insert: "bg-green-500/20 text-green-400 border-green-500/30",
+ Insert: "bg-green-500/20 text-ok border-green-500/30",
Update: "bg-orange-500/20 text-orange-400 border-orange-500/30",
- Delete: "bg-red-500/20 text-red-400 border-red-500/30",
+ Delete: "bg-red-500/20 text-danger border-red-500/30",
Create: "bg-purple-500/20 text-purple-400 border-purple-500/30",
From: "bg-cyan-500/20 text-cyan-400 border-cyan-500/30",
Where: "bg-yellow-500/20 text-yellow-400 border-yellow-500/30",
@@ -49,7 +49,7 @@ function AstNode({ data, depth = 0, label }: AstNodeProps) {
return (
{label && {label}: }
-
+
{typeof data === "string" ? `"${data}"` : String(data)}
@@ -167,7 +167,7 @@ export default function AstTab({ data }: AstTabProps) {
return (
-
+
@@ -190,11 +190,11 @@ export default function AstTab({ data }: AstTabProps) {
>
{copied ? (
<>
-
-
Copied!
+
+
Copied!
>
) : copyFailed ? (
-
Failed
+
Failed
) : (
<>
diff --git a/website/src/components/playground/FormatTab.tsx b/website/src/components/playground/FormatTab.tsx
index 876ae668..c6437169 100644
--- a/website/src/components/playground/FormatTab.tsx
+++ b/website/src/components/playground/FormatTab.tsx
@@ -39,7 +39,7 @@ export default function FormatTab({ data }: FormatTabProps) {
return (
-
+
@@ -65,11 +65,11 @@ export default function FormatTab({ data }: FormatTabProps) {
>
{copied ? (
<>
-
-
Copied!
+
+
Copied!
>
) : copyFailed ? (
-
Failed
+
Failed
) : (
<>
diff --git a/website/src/components/playground/LintTab.tsx b/website/src/components/playground/LintTab.tsx
index e616885f..1701a212 100644
--- a/website/src/components/playground/LintTab.tsx
+++ b/website/src/components/playground/LintTab.tsx
@@ -25,7 +25,7 @@ interface LintTabProps {
function SeverityBadge({ severity }: { severity: string }) {
const s = severity?.toLowerCase() || "info";
const styles: Record
= {
- error: "bg-red-500/20 text-red-400 border-red-500/30",
+ error: "bg-red-500/20 text-danger border-red-500/30",
warning: "bg-yellow-500/20 text-yellow-400 border-yellow-500/30",
info: "bg-blue-500/20 text-blue-400 border-blue-500/30",
};
@@ -80,7 +80,7 @@ export default function LintTab({ data }: LintTabProps) {
return (
-
+
@@ -96,11 +96,11 @@ export default function LintTab({ data }: LintTabProps) {
return (
-
No violations found
+
No violations found
Your SQL looks clean!
);
@@ -117,11 +117,11 @@ export default function LintTab({ data }: LintTabProps) {
>
{copied ? (
<>
-
-
Copied!
+
+
Copied!
>
) : copyFailed ? (
-
Failed
+
Failed
) : (
<>
diff --git a/website/src/components/playground/Playground.tsx b/website/src/components/playground/Playground.tsx
index 6172799a..24c86105 100644
--- a/website/src/components/playground/Playground.tsx
+++ b/website/src/components/playground/Playground.tsx
@@ -121,7 +121,7 @@ export default function Playground() {
if (loading) {
return (
-
+
{/* Skeleton toolbar */}
@@ -185,14 +185,14 @@ export default function Playground() {
if (error) {
return (
-
+
-
Failed to load SQL parser
+
Failed to load SQL parser
{error.message}
Try refreshing the page to retry.
@@ -203,7 +203,7 @@ export default function Playground() {
const hasResults = results.ast !== null;
return (
-
+
{/* Top toolbar */}
@@ -294,7 +294,7 @@ export default function Playground() {
Ready to use this in your project?
-
+
go get github.com/ajitpratap0/GoSQLX
{
render() {
if (this.state.hasError) {
return (
-
+
-
Failed to load SQL parser
+
Failed to load SQL parser
{this.state.error?.message}
this.setState({ hasError: false, error: null })}
diff --git a/website/src/components/ui/SearchModal.tsx b/website/src/components/ui/SearchModal.tsx
index 646cba17..36c69bb9 100644
--- a/website/src/components/ui/SearchModal.tsx
+++ b/website/src/components/ui/SearchModal.tsx
@@ -156,7 +156,7 @@ export function SearchModal({ open, onClose }: SearchModalProps) {
{/* Search input */}
setQuery(e.target.value)}
onKeyDown={handleKeyDown}
placeholder="Search documentation..."
- className="flex-1 bg-transparent py-3.5 text-sm text-white placeholder:text-text-muted outline-none"
+ className="flex-1 bg-transparent py-3.5 text-sm text-white placeholder:text-fg-subtle outline-none"
aria-label="Search documentation"
autoComplete="off"
spellCheck={false}
/>
-
+
ESC
@@ -199,7 +199,7 @@ export function SearchModal({ open, onClose }: SearchModalProps) {
aria-label="Search results"
>
{results.length === 0 && (
-
+
No results found for “{query}”
)}
@@ -211,7 +211,7 @@ export function SearchModal({ open, onClose }: SearchModalProps) {
aria-selected={i === selectedIndex}
className={`mx-2 flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2.5 text-sm transition-colors ${
i === selectedIndex
- ? 'bg-accent-indigo/20 text-white'
+ ? 'bg-accent/20 text-white'
: 'text-zinc-400 hover:bg-white/[0.04] hover:text-zinc-200'
}`}
onClick={() => navigate(entry)}
@@ -219,7 +219,7 @@ export function SearchModal({ open, onClose }: SearchModalProps) {
>
{/* Icon */}
{entry.title}
-
{entry.category}
+
{entry.category}
{i === selectedIndex && (
-
+
Enter
)}
@@ -245,7 +245,7 @@ export function SearchModal({ open, onClose }: SearchModalProps) {
{/* Footer */}
-
+
↑↓
navigate
diff --git a/website/src/components/ui/TerminalMockup.tsx b/website/src/components/ui/TerminalMockup.tsx
index 833e095a..d0cc7e28 100644
--- a/website/src/components/ui/TerminalMockup.tsx
+++ b/website/src/components/ui/TerminalMockup.tsx
@@ -5,11 +5,11 @@ export function TerminalMockup({ command, output }: { command: string; output?:
- Terminal
+ Terminal
-
$ {command}
- {output &&
{output}
}
+
$ {command}
+ {output &&
{output}
}
);
diff --git a/website/src/components/ui/VersionBadge.tsx b/website/src/components/ui/VersionBadge.tsx
index ab148c48..53e52b7b 100644
--- a/website/src/components/ui/VersionBadge.tsx
+++ b/website/src/components/ui/VersionBadge.tsx
@@ -1,6 +1,6 @@
export function VersionBadge({ version }: { version: string }) {
return (
-
+
{version}
);
diff --git a/website/src/lib/constants.ts b/website/src/lib/constants.ts
index 3b99e464..788e7275 100644
--- a/website/src/lib/constants.ts
+++ b/website/src/lib/constants.ts
@@ -10,11 +10,11 @@ export const NAV_LINKS = [
];
export const FEATURES = [
- { icon: 'globe', title: 'Multi-Dialect', description: 'PostgreSQL, MySQL, MariaDB, SQLite, SQL Server, Oracle, Snowflake, ClickHouse.', color: 'accent-purple' },
- { icon: 'lock', title: 'Thread-Safe', description: 'Race-detector clean in CI.', color: 'accent-green' },
- { icon: 'bolt', title: 'Zero-Copy', description: 'Direct byte slice operations. No unnecessary allocations.', color: 'accent-orange' },
- { icon: 'recycle', title: 'Object Pooling', description: 'sync.Pool recycling for ASTs, tokenizers, expressions.', color: 'accent-indigo' },
- { icon: 'shield', title: 'Security Scanner', description: 'SQL injection detection with severity classification.', color: 'red' },
+ { icon: 'globe', title: 'Multi-Dialect', description: 'PostgreSQL, MySQL, MariaDB, SQLite, SQL Server, Oracle, Snowflake, ClickHouse.', color: 'accent' },
+ { icon: 'lock', title: 'Thread-Safe', description: 'Race-detector clean in CI.', color: 'brand' },
+ { icon: 'bolt', title: 'Zero-Copy', description: 'Direct byte slice operations. No unnecessary allocations.', color: 'accent-warm' },
+ { icon: 'recycle', title: 'Object Pooling', description: 'sync.Pool recycling for ASTs, tokenizers, expressions.', color: 'accent' },
+ { icon: 'shield', title: 'Security Scanner', description: 'SQL injection detection with severity classification.', color: 'danger' },
{ icon: 'cpu', title: 'MCP Server', description: `${PROJECT.mcpToolCount} SQL tools for Claude, Cursor, and any MCP client.`, color: 'cyan' },
];