diff --git a/frontend/src/pages/customer/CustomerLayout.tsx b/frontend/src/pages/customer/CustomerLayout.tsx
index 3f26f5d9..3391371b 100644
--- a/frontend/src/pages/customer/CustomerLayout.tsx
+++ b/frontend/src/pages/customer/CustomerLayout.tsx
@@ -175,24 +175,32 @@ export const CustomerLayout: React.FC = () => {
key={item.to}
to={item.to}
onClick={() => setSidebarOpen(false)}
- className="flex items-center gap-3 px-3 py-2 text-sm font-medium rounded-lg transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2"
- style={isActive ? {
- backgroundColor: 'color-mix(in srgb, var(--color-accent) 12%, transparent)',
- color: 'var(--color-accent)',
- } : undefined}
+ className={`flex items-center px-3 py-2 text-sm font-medium rounded-lg transition-colors ${
+ isActive
+ ? 'bg-accent-dark text-white'
+ : 'text-neutral-700 dark:text-neutral-300 hover:bg-neutral-100 dark:hover:bg-neutral-800 hover:text-neutral-900 dark:hover:text-neutral-100'
+ }`}
>
-
-
- {t(item.labelKey, item.fallback)}
-
- {/* Coming-soon pill for the gated entries. The pages
- themselves are still placeholders even when the
- admin has enabled access — the badge keeps that
- promise honest. */}
+ {/* Mirrors AdminSidebar's active state exactly: solid
+ accent-dark pill, white icon and label, no extra
+ flex grow on the label so the pill width matches
+ what the admin chrome renders. */}
+
+ {t(item.labelKey, item.fallback)}
+ {/* Coming-soon pill for the gated entries. Pushed to
+ the right of the label with ml-auto so it doesn't
+ add the flex-1 stretching that was throwing off
+ the active-pill visual. */}
{item.feature && (