+ {isSuccess && (
+
+ {particles.map((p) => (
+
+ ))}
+
+ )}
-
🎉
-
{t('licenseSuccess.title')}
-
{t('licenseSuccess.subtitle')}
+
+ {isVerifying ? (
+
+ ) : (
+
{isSuccess ? '🎉' : '✓'}
+ )}
+
+
{title}
+
{subtitle}
-
- {t('licenseSuccess.description')}
-
-
+
{description}
+ {!isVerifying && (
+
+ )}
diff --git a/frontend/src/components/ui/MobileMenu.tsx b/frontend/src/components/ui/MobileMenu.tsx
index 35a52f7..f12e660 100644
--- a/frontend/src/components/ui/MobileMenu.tsx
+++ b/frontend/src/components/ui/MobileMenu.tsx
@@ -14,7 +14,8 @@ import { SpinnerIcon } from './icons/SpinnerIcon';
interface MobileMenuProps {
activePage: Page;
- onPageChange: (page: Page) => void;
+ activeHash: string;
+ onPageChange: (page: Page, hash?: string) => void;
theme: 'light' | 'dark';
onToggleTheme: () => void;
exportState: HeaderExportState | null;
@@ -32,6 +33,7 @@ interface MobileMenuProps {
export default function MobileMenu({
activePage,
+ activeHash,
onPageChange,
theme,
onToggleTheme,
@@ -52,25 +54,30 @@ export default function MobileMenu({
const emailLocal = emailParts?.[0] ?? '';
const emailDomain = emailParts && emailParts.length > 1 ? emailParts.slice(1).join('@') : '';
- const mobileNavItem = (page: Page, label: string) => (
-
{
- if (e.metaKey || e.ctrlKey || e.shiftKey || e.button !== 0) return;
- e.preventDefault();
- onPageChange(page);
- onClose();
- }}
- >
- {label}
-
- );
+ const mobileNavItem = (page: Page, label: string, hash?: string) => {
+ const isActive =
+ activePage === page &&
+ (hash ? activeHash === hash : page !== 'account' || activeHash !== 'invites');
+ const href = hash ? `${PAGE_PATHS[page]}#${hash}` : PAGE_PATHS[page];
+
+ return (
+
{
+ if (e.metaKey || e.ctrlKey || e.shiftKey || e.button !== 0) return;
+ e.preventDefault();
+ onPageChange(page, hash);
+ onClose();
+ }}
+ >
+ {label}
+
+ );
+ };
const dashboardActionClass =
'w-full flex cursor-pointer items-center justify-center gap-2 px-3 py-2 rounded bg-navy-800 text-sm font-semibold text-white border border-navy-700 shadow-sm hover:bg-navy-700 disabled:opacity-50 transition-colors';
@@ -169,7 +176,7 @@ export default function MobileMenu({
{user?.subscription !== 'licensed' &&
!user?.isAdmin &&
mobileNavItem('pricing', t('header.pricing'))}
- {user && mobileNavItem('invites', t('header.inviteFriends'))}
+ {user && mobileNavItem('account', t('header.inviteFriends'), 'invites')}
{user && mobileNavItem('account', t('userMenu.account'))}
{activePage !== 'dashboard' && user && mobileNavItem('saved', t('header.saved'))}
diff --git a/frontend/src/components/ui/SubNav.tsx b/frontend/src/components/ui/SubNav.tsx
index 21b4a1a..6ed8515 100644
--- a/frontend/src/components/ui/SubNav.tsx
+++ b/frontend/src/components/ui/SubNav.tsx
@@ -11,7 +11,7 @@ export function SubNav({ tabs, activeTab, onTabChange }: SubNavProps) {
{tabs.map((tab) => (