diff --git a/src/app/globals.css b/src/app/globals.css index ac55b2c..a79fb3f 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -16,6 +16,14 @@ --color-ink-faint: #64748b; --color-paper: #f6f7f9; --color-line: #e2e8f0; + + /* Dark-mode visual polish tokens */ + --color-surface-hover: #1e2330; + --color-surface-active: #2b3145; + --color-border-dark: #232a36; + --color-brand-hover: #4338ca; + --color-brand-dark: #6366f1; + --color-brand-dark-hover: #818cf8; } @layer base { @@ -247,3 +255,27 @@ html.dark .react-flow__controls-button svg { html.dark .react-flow__attribution { color: rgba(255, 255, 255, 0.3); } + +/* ---- React Flow Custom Node & Selection overrides ---- */ +.react-flow__node { + transition: border-color 0.25s, box-shadow 0.25s !important; +} + +.react-flow__node:hover { + border-color: var(--color-brand) !important; +} + +html.dark .react-flow__node:hover { + border-color: var(--color-brand-dark) !important; +} + +.react-flow__node.selected { + border-color: var(--color-brand) !important; + box-shadow: 0 0 0 2px rgba(79, 70, 229, 0.2) !important; +} + +html.dark .react-flow__node.selected { + border-color: var(--color-brand-dark) !important; + box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.4) !important; +} + diff --git a/src/components/docs/DocsSidebar.tsx b/src/components/docs/DocsSidebar.tsx index ba9b81e..45f3e3c 100644 --- a/src/components/docs/DocsSidebar.tsx +++ b/src/components/docs/DocsSidebar.tsx @@ -23,7 +23,7 @@ export default function DocsSidebar({ {t.documentation}

)} -
+
{DOC_NAV.map((d) => { const href = `/${lang}/docs/${d.slug}`; const active = pathname === href; @@ -34,8 +34,8 @@ export default function DocsSidebar({ aria-current={active ? "page" : undefined} className={`-ml-px border-l-2 px-4 py-2 text-sm transition-colors ${ active - ? "border-[#4f46e5] font-medium text-[#4f46e5] dark:text-[#a5b4fc]" - : "border-transparent text-[#475569] dark:text-[#9aa6b8] hover:border-[#cbd5e1] hover:text-[#0f172a]" + ? "border-brand font-medium text-brand dark:border-brand-dark dark:text-brand-dark-hover" + : "border-transparent text-ink-soft dark:text-muted hover:border-slate-300 dark:hover:border-muted hover:text-ink dark:hover:text-fg" }`} > {d.title[lang] ?? d.title["en"]} diff --git a/src/components/layout/Header.tsx b/src/components/layout/Header.tsx index f258d71..5270902 100644 --- a/src/components/layout/Header.tsx +++ b/src/components/layout/Header.tsx @@ -55,19 +55,19 @@ const GitHubIcon = ( ); const linkClass = - "flex items-center gap-1.5 px-3 py-1.5 rounded-full text-[13px] text-[#475569] hover:text-[#0f172a] hover:bg-black/[0.04] transition-colors dark:text-[#94a3b8] dark:hover:text-[#e6e9ef] dark:hover:bg-white/[0.06]"; + "flex items-center gap-1.5 px-3 py-1.5 rounded-full text-[13px] text-ink-soft hover:text-ink hover:bg-black/[0.04] transition-colors dark:text-muted dark:hover:text-fg dark:hover:bg-surface-hover"; const pillClass = - "flex items-center gap-1.5 rounded-full border border-[#e2e8f0] dark:border-[#232a36] px-3 py-1.5 text-[13px] font-medium text-[#475569] dark:text-[#9aa6b8] hover:border-[#4f46e5] hover:text-[#0f172a] dark:hover:text-[#e6e9ef] transition-colors"; + "flex items-center gap-1.5 rounded-full border border-line dark:border-border-dark px-3 py-1.5 text-[13px] font-medium text-ink-soft dark:text-muted hover:border-brand hover:text-ink dark:hover:border-brand-dark dark:hover:text-fg dark:hover:bg-surface-hover transition-colors"; const ctaClass = - "shrink-0 whitespace-nowrap rounded-full bg-[#4f46e5] px-3.5 py-1.5 text-[13px] font-semibold text-white transition hover:-translate-y-px hover:bg-[#4338ca] sm:px-4 dark:bg-[#6366f1] dark:hover:bg-[#4f46e5]"; + "shrink-0 whitespace-nowrap rounded-full bg-brand px-3.5 py-1.5 text-[13px] font-semibold text-white transition hover:-translate-y-px hover:bg-brand-hover sm:px-4 dark:bg-brand-dark dark:hover:bg-brand-dark-hover"; const signInClass = - "whitespace-nowrap rounded-full border border-[#e2e8f0] px-3.5 py-1.5 text-[13px] font-semibold text-[#0f172a] transition hover:bg-black/[0.04] dark:border-white/[0.14] dark:text-[#e6e9ef] dark:hover:bg-white/[0.06]"; + "whitespace-nowrap rounded-full border border-line px-3.5 py-1.5 text-[13px] font-semibold text-ink transition hover:bg-black/[0.04] dark:border-border-dark dark:text-fg dark:hover:bg-surface-hover"; const menuItemClass = - "flex w-full items-center px-3 py-2 rounded-lg text-left text-[13px] font-medium text-[#475569] hover:bg-[#f8fafc] hover:text-[#0f172a] dark:text-[#94a3b8] dark:hover:bg-white/[0.04] dark:hover:text-white transition-colors"; + "flex w-full items-center px-3 py-2 rounded-lg text-left text-[13px] font-medium text-ink-soft hover:bg-slate-50 hover:text-ink dark:text-muted dark:hover:bg-surface-hover dark:hover:text-fg transition-colors"; export default function Header({ lang, @@ -171,7 +171,7 @@ export default function Header({ aria-expanded={dropdownOpen} aria-haspopup="listbox" aria-label="Select language" - className="flex items-center gap-1.5 px-3.5 py-[6px] rounded-full border text-[13px] font-semibold transition-all bg-black/[0.04] border-[#e2e8f0] text-[#0f172a] hover:bg-black/[0.08] dark:bg-white/[0.08] dark:border-white/[0.14] dark:text-[#cbd5e1] dark:hover:bg-white/[0.16]" + className="flex items-center gap-1.5 px-3.5 py-[6px] rounded-full border text-[13px] font-semibold transition-all bg-black/[0.04] border-line text-ink hover:bg-black/[0.08] dark:bg-surface dark:border-border-dark dark:text-fg dark:hover:bg-surface-hover" > 🌐 {LANGUAGE_NAMES[lang] ?? lang.toUpperCase()} @@ -194,8 +194,8 @@ export default function Header({ onClick={() => setDropdownOpen(false)} className={`flex items-center justify-between w-full px-3 py-1.5 rounded-lg text-left text-[13px] font-medium transition-colors ${ active - ? "bg-[#f1f5f9] text-[#4f46e5] dark:bg-white/[0.08] dark:text-white" - : "text-[#475569] hover:bg-[#f8fafc] hover:text-[#0f172a] dark:text-[#94a3b8] dark:hover:bg-white/[0.04] dark:hover:text-white" + ? "bg-slate-100 text-brand dark:bg-surface-active dark:text-fg" + : "text-ink-soft hover:bg-slate-50 hover:text-ink dark:text-muted dark:hover:bg-surface-hover dark:hover:text-fg" }`} > @@ -220,7 +220,7 @@ export default function Header({ onClick={() => setUserMenuOpen(!userMenuOpen)} aria-expanded={userMenuOpen} aria-haspopup="menu" - className="flex items-center gap-2 rounded-full border border-[#e2e8f0] p-0.5 pr-2.5 text-[13px] font-medium text-[#0f172a] transition-colors hover:bg-black/[0.04] dark:border-white/[0.14] dark:text-[#e6e9ef] dark:hover:bg-white/[0.06]" + className="flex items-center gap-2 rounded-full border border-line p-0.5 pr-2.5 text-[13px] font-medium text-ink transition-colors hover:bg-black/[0.04] dark:border-border-dark dark:text-fg dark:hover:bg-surface-hover" > {avatar(26)} @@ -237,7 +237,7 @@ export default function Header({ className="fixed inset-0 z-10" onClick={() => setUserMenuOpen(false)} /> -
+
{avatar(32)}
@@ -290,7 +290,7 @@ export default function Header({ onClick={() => setMenuOpen(true)} aria-label="Menu" aria-expanded={menuOpen} - className="grid place-items-center h-8 w-8 rounded-full border border-[#e2e8f0] text-[#0f172a] transition-colors hover:bg-black/[0.04] dark:border-white/[0.14] dark:text-[#e6e9ef] dark:hover:bg-white/[0.06]" + className="grid place-items-center h-8 w-8 rounded-full border border-line text-ink transition-colors hover:bg-black/[0.04] dark:border-border-dark dark:text-fg dark:hover:bg-surface-hover" > setMenuOpen(false)} /> -
+
setMenuOpen(false)}>{docsLink("w-full")}
setMenuOpen(false)} className="mt-1"> {starsLink("w-full justify-center")}
-
+
{/* Languages */}
@@ -335,8 +335,8 @@ export default function Header({ onClick={() => setMenuOpen(false)} className={`flex items-center justify-between rounded-lg px-3 py-2 text-[13px] font-medium transition-colors ${ active - ? "bg-[#f1f5f9] text-[#4f46e5] dark:bg-white/[0.08] dark:text-white" - : "text-[#475569] hover:bg-[#f8fafc] hover:text-[#0f172a] dark:text-[#94a3b8] dark:hover:bg-white/[0.04] dark:hover:text-white" + ? "bg-slate-100 text-brand dark:bg-surface-active dark:text-fg" + : "text-ink-soft hover:bg-slate-50 hover:text-ink dark:text-muted dark:hover:bg-surface-hover dark:hover:text-fg" }`} > {LANGUAGE_NAMES[locale] ?? locale.toUpperCase()} @@ -346,7 +346,7 @@ export default function Header({ })}
-
+
{/* Auth + CTA */} {isDark ? ( {getStarted} {learnMore} diff --git a/src/components/sections/HowItWorks.tsx b/src/components/sections/HowItWorks.tsx index 45ecd73..501221c 100644 --- a/src/components/sections/HowItWorks.tsx +++ b/src/components/sections/HowItWorks.tsx @@ -48,17 +48,17 @@ export default function HowItWorks({ {/* Hairline grid: gap-px over a bordered container draws crisp rules between cells. */} -
    +
      {steps.map((step, i) => (
    1. - + {`0${i + 1}`} - + {ICONS[i]}
      diff --git a/src/components/sections/Showcase.tsx b/src/components/sections/Showcase.tsx index 49e7807..e8ea816 100644 --- a/src/components/sections/Showcase.tsx +++ b/src/components/sections/Showcase.tsx @@ -171,8 +171,8 @@ export default function Showcase({ > -
      -
      +
      +
      @@ -183,7 +183,7 @@ export default function Showcase({ {callDesc}

      -
      +
      diff --git a/src/components/sections/SupportedLanguages.tsx b/src/components/sections/SupportedLanguages.tsx index a504912..15636ad 100644 --- a/src/components/sections/SupportedLanguages.tsx +++ b/src/components/sections/SupportedLanguages.tsx @@ -19,13 +19,13 @@ export default function SupportedLanguages({ title, subtitle, rows }: Props) { {subtitle}

      -
        +
          {rows.map((row) => (
        • - + {row.name} diff --git a/src/components/sections/TestimonialsBoard.tsx b/src/components/sections/TestimonialsBoard.tsx index 368f2bc..2109206 100644 --- a/src/components/sections/TestimonialsBoard.tsx +++ b/src/components/sections/TestimonialsBoard.tsx @@ -121,8 +121,8 @@ export default function TestimonialsBoard({ const chipClass = (active: boolean) => `rounded-full px-3 py-1.5 text-[13px] font-medium transition-colors ${ active - ? "bg-[#4f46e5] text-white dark:bg-[#6366f1]" - : "border border-[#e2e8f0] text-[#475569] hover:border-[#4f46e5] hover:text-[#0f172a] dark:border-[#232a36] dark:text-[#9aa6b8]" + ? "bg-brand text-white dark:bg-brand-dark" + : "border border-line text-ink-soft hover:border-brand hover:text-ink hover:bg-slate-50 dark:border-border-dark dark:text-muted dark:hover:border-brand-dark dark:hover:text-fg dark:hover:bg-surface-hover" }`; return ( @@ -203,7 +203,7 @@ export default function TestimonialsBoard({ diff --git a/src/components/sections/UseCases.tsx b/src/components/sections/UseCases.tsx index 718bda4..c529933 100644 --- a/src/components/sections/UseCases.tsx +++ b/src/components/sections/UseCases.tsx @@ -13,13 +13,13 @@ export default function UseCases({ title, items }: Props) {
          -
          +
          {items.map((item, i) => (
          - + {`0${i + 1}`}

          diff --git a/src/components/ui/CodeWorkspace.tsx b/src/components/ui/CodeWorkspace.tsx index 0ab5ead..2b2b8f3 100644 --- a/src/components/ui/CodeWorkspace.tsx +++ b/src/components/ui/CodeWorkspace.tsx @@ -361,8 +361,8 @@ export default function CodeWorkspace({ onClick={() => setMode(value)} className={`px-3 py-1 rounded-md text-[12px] font-medium transition-colors ${ mode === value - ? "bg-[#eef2ff] dark:bg-[#1b1f3a] text-[#0f172a] dark:text-[#e6e9ef]" - : "text-[#475569] dark:text-[#9aa6b8] hover:text-[#0f172a]" + ? "bg-[#eef2ff] dark:bg-[#1b1f3a] text-brand dark:text-[#e6e9ef]" + : "text-ink-soft dark:text-muted hover:text-ink dark:hover:text-fg hover:bg-slate-100 dark:hover:bg-surface-hover" }`} > {label} @@ -430,10 +430,10 @@ export default function CodeWorkspace({ {!files ? (