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"
>