From 3a2adbec7669851a867dbdfe576b539c37ad23d1 Mon Sep 17 00:00:00 2001 From: AI Directory Platform Date: Tue, 8 Sep 2026 20:17:11 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BA=A4=E4=BA=92=E4=BD=93=E9=AA=8C?= =?UTF-8?q?=E4=B8=93=E9=A1=B9=E4=BC=98=E5=8C=96=EF=BC=887=20=E9=A1=B9?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 登录回跳贯通:邮箱登录成功后按 ?redirect= 回到原页面(投票/收藏/评论的登录拦截闭环) - 收藏按钮的登录跳转补上 redirect 参数 - 营销路由组 loading.tsx 骨架屏(客户端导航即时反馈) - 投票按钮/收藏爱心按下缩放微交互 - 移动端抽屉滑入动画(keyframes + animate-drawer-in) - 工具列表空状态加'清除搜索与筛选'按钮(en/zh) - 品牌 404 页(图标 + Back to home / Browse tools 双入口) --- packages/core/messages/en.json | 3 +- packages/core/messages/zh.json | 3 +- packages/core/scripts/generate-site.mjs | 1 + .../features/auth/components/login-form.tsx | 7 +++- .../tools/components/favorite-button.tsx | 6 ++-- .../features/tools/components/tools-list.tsx | 7 ++++ .../voting/components/vote-button.tsx | 4 +-- packages/core/src/kit/theme-header.tsx | 2 +- .../pages/[locale]/(marketing)/loading.tsx | 21 ++++++++++++ .../pages/[locale]/(marketing)/tools/page.tsx | 1 + packages/core/src/pages/not-found.tsx | 34 +++++++++++++++---- packages/core/src/styles/globals.css | 15 ++++++++ 12 files changed, 89 insertions(+), 15 deletions(-) create mode 100644 packages/core/src/pages/[locale]/(marketing)/loading.tsx diff --git a/packages/core/messages/en.json b/packages/core/messages/en.json index 2f12e24..f4509ec 100644 --- a/packages/core/messages/en.json +++ b/packages/core/messages/en.json @@ -645,7 +645,8 @@ "sort": { "latest": "Latest", "trending": "Trending" - } + }, + "clearFilters": "Clear search & filters" }, "seo": { "home": { diff --git a/packages/core/messages/zh.json b/packages/core/messages/zh.json index 3d0c5c5..13ba2db 100644 --- a/packages/core/messages/zh.json +++ b/packages/core/messages/zh.json @@ -653,7 +653,8 @@ "sort": { "latest": "最新", "trending": "最热" - } + }, + "clearFilters": "清除搜索与筛选" }, "seo": { "home": { diff --git a/packages/core/scripts/generate-site.mjs b/packages/core/scripts/generate-site.mjs index 198d7cb..2ea6c9f 100644 --- a/packages/core/scripts/generate-site.mjs +++ b/packages/core/scripts/generate-site.mjs @@ -314,6 +314,7 @@ function collectRoutes() { entry.name === "page.tsx" || entry.name === "route.ts" || entry.name === "layout.tsx" || + entry.name === "loading.tsx" || entry.name === "not-found.tsx" || entry.name === "manifest.ts" || entry.name === "sitemap.ts" diff --git a/packages/core/src/features/auth/components/login-form.tsx b/packages/core/src/features/auth/components/login-form.tsx index 9766126..65e7ca9 100644 --- a/packages/core/src/features/auth/components/login-form.tsx +++ b/packages/core/src/features/auth/components/login-form.tsx @@ -44,7 +44,12 @@ export function LoginForm() { return; } - router.push(`/${locale}/`); + // 登录成功后回跳原页面(投票/收藏/评论的登录拦截会带 ?redirect= 参数) + const redirect = + typeof window !== "undefined" + ? new URLSearchParams(window.location.search).get("redirect") + : null; + router.push(redirect || `/${locale}/`); } catch (err) { setError(t('errors.loginFailed')); } finally { diff --git a/packages/core/src/features/tools/components/favorite-button.tsx b/packages/core/src/features/tools/components/favorite-button.tsx index 7b21c49..bc5c685 100644 --- a/packages/core/src/features/tools/components/favorite-button.tsx +++ b/packages/core/src/features/tools/components/favorite-button.tsx @@ -53,7 +53,9 @@ export function FavoritesProvider({ children }: { children: React.ReactNode }) { (toolId: string) => { if (!isAuthenticated) { toast(t("loginRequired")); - router.push(`/${locale}/login`); + router.push( + `/${locale}/login?redirect=${encodeURIComponent(window.location.pathname)}` + ); return; } @@ -161,7 +163,7 @@ export function FavoriteButton({ ctx.toggle(toolId); }} className={cn( - "rounded-full p-2 transition-colors", + "rounded-full p-2 transition-all active:scale-125", favorited ? "text-red-500 hover:text-red-600" : "text-muted-foreground/50 hover:text-red-500" diff --git a/packages/core/src/features/tools/components/tools-list.tsx b/packages/core/src/features/tools/components/tools-list.tsx index 97e5ea3..0d85c0e 100644 --- a/packages/core/src/features/tools/components/tools-list.tsx +++ b/packages/core/src/features/tools/components/tools-list.tsx @@ -49,6 +49,7 @@ interface ToolsTranslations { pricingPaid: string; sortLatest: string; sortTrending: string; + clearFilters: string; } interface UseCaseOption { @@ -351,6 +352,12 @@ export function ToolsList({

{translations.noTools}

+ )} diff --git a/packages/core/src/features/voting/components/vote-button.tsx b/packages/core/src/features/voting/components/vote-button.tsx index fdead67..868ef83 100644 --- a/packages/core/src/features/voting/components/vote-button.tsx +++ b/packages/core/src/features/voting/components/vote-button.tsx @@ -186,7 +186,7 @@ export function VoteButton({ aria-pressed={voted} aria-label={voted ? t("unvote") : t("vote")} className={cn( - "flex h-fit min-w-[4.5rem] flex-col items-center gap-0.5 rounded-xl border px-3 py-2.5 transition-colors", + "flex h-fit min-w-[4.5rem] flex-col items-center gap-0.5 rounded-xl border px-3 py-2.5 transition-all active:scale-95", voted ? "border-primary/60 bg-primary/10 text-primary" : "border-border text-foreground hover:border-primary/40 hover:bg-primary/5" @@ -205,7 +205,7 @@ export function VoteButton({ onClick={() => ctx.toggle(toolId)} aria-pressed={voted} className={cn( - "flex w-full items-center justify-center gap-2 rounded-lg border px-4 py-2.5 text-sm font-medium transition-colors", + "flex w-full items-center justify-center gap-2 rounded-lg border px-4 py-2.5 text-sm font-medium transition-all active:scale-[0.98]", voted ? "border-primary/60 bg-primary/10 text-primary" : "border-border text-foreground hover:bg-hover" diff --git a/packages/core/src/kit/theme-header.tsx b/packages/core/src/kit/theme-header.tsx index 6026604..d5bbfcd 100644 --- a/packages/core/src/kit/theme-header.tsx +++ b/packages/core/src/kit/theme-header.tsx @@ -127,7 +127,7 @@ export function ThemeHeader({ {/* Mobile 抽屉 */} {open && ( -