diff --git a/package.json b/package.json
index 58963f48..78ebce55 100644
--- a/package.json
+++ b/package.json
@@ -29,6 +29,7 @@
"pino": "^10.3.1",
"react": "19.2.4",
"react-dom": "19.2.4",
+ "react-icons": "^5.6.0",
"stripe": "^22.2.1",
"unstorage": "^1.17.5",
"xstate": "^5",
@@ -36,8 +37,6 @@
},
"devDependencies": {
"@serwist/turbopack": "^9.0.0",
- "esbuild": "^0.25.0",
- "serwist": "^9.0.0",
"@tailwindcss/postcss": "^4",
"@types/node": "^20",
"@types/react": "^19",
@@ -45,9 +44,11 @@
"@vitest/coverage-v8": "^4.1.8",
"@vitest/ui": "^4.1.8",
"barrelsby": "^2.8.1",
+ "esbuild": "^0.25.0",
"eslint": "^9",
"eslint-config-next": "16.2.7",
"jsdom": "^29.1.1",
+ "serwist": "^9.0.0",
"tailwindcss": "^4",
"typescript": "^5",
"vitest": "^4.1.8"
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 1ca08180..57fde0b2 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -47,6 +47,9 @@ importers:
react-dom:
specifier: 19.2.4
version: 19.2.4(react@19.2.4)
+ react-icons:
+ specifier: ^5.6.0
+ version: 5.6.0(react@19.2.4)
stripe:
specifier: ^22.2.1
version: 22.2.1(@types/node@20.19.41)
@@ -2698,6 +2701,11 @@ packages:
peerDependencies:
react: ^19.2.4
+ react-icons@5.6.0:
+ resolution: {integrity: sha512-RH93p5ki6LfOiIt0UtDyNg/cee+HLVR6cHHtW3wALfo+eOHTp8RnU2kRkI6E+H19zMIs03DyxUG/GfZMOGvmiA==}
+ peerDependencies:
+ react: '*'
+
react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
@@ -5890,6 +5898,10 @@ snapshots:
react: 19.2.4
scheduler: 0.27.0
+ react-icons@5.6.0(react@19.2.4):
+ dependencies:
+ react: 19.2.4
+
react-is@16.13.1: {}
react@19.2.4: {}
diff --git a/src/app/auth/components/auth-facebook-panel.tsx b/src/app/auth/components/auth-facebook-panel.tsx
index 6f3e8e1f..830f55f2 100644
--- a/src/app/auth/components/auth-facebook-panel.tsx
+++ b/src/app/auth/components/auth-facebook-panel.tsx
@@ -21,6 +21,7 @@ import { useAuthDispatch, useAuthState } from "@/stores/auth/auth-context";
import { AuthErrorMessage } from "./auth-error-message";
import { AuthLegalText } from "./auth-legal-text";
import { AuthOtherOptionsDialog } from "./auth-other-options-dialog";
+import { AuthProviderIcon } from "./auth-provider-icon";
import styles from "./auth-facebook-panel.module.css";
export interface AuthFacebookPanelProps {
@@ -70,9 +71,7 @@ export function AuthFacebookPanel({ onSwitchToEmail }: AuthFacebookPanelProps) {
) : (
-
+
)}
diff --git a/src/app/auth/components/auth-other-options-dialog.tsx b/src/app/auth/components/auth-other-options-dialog.tsx
index 69183253..650eb027 100644
--- a/src/app/auth/components/auth-other-options-dialog.tsx
+++ b/src/app/auth/components/auth-other-options-dialog.tsx
@@ -14,9 +14,11 @@
* - Cancel 文本按钮
*/
import type { ReactNode } from "react";
+import { Mail } from "lucide-react";
import { BottomSheet } from "@/app/_components/core/bottom-sheet";
+import { AuthProviderIcon } from "./auth-provider-icon";
import { AuthSocialButton } from "./auth-social-button";
import styles from "./auth-other-options-dialog.module.css";
@@ -53,17 +55,7 @@ export function AuthOtherOptionsDialog({
{mode === "facebook" ? (
-
-
- }
+ icon={}
onClick={() => {
onClose();
onEmail();
@@ -73,17 +65,7 @@ export function AuthOtherOptionsDialog({
) : (
-
-
- }
+ icon={}
onClick={() => {
onClose();
onFacebook();
@@ -97,26 +79,7 @@ export function AuthOtherOptionsDialog({
{googleSlot}
) : (
-
-
-
-
-
- }
+ icon={}
onClick={() => {
onClose();
onGoogle();
diff --git a/src/app/auth/components/auth-panel.tsx b/src/app/auth/components/auth-panel.tsx
index 5d69b593..f4185645 100644
--- a/src/app/auth/components/auth-panel.tsx
+++ b/src/app/auth/components/auth-panel.tsx
@@ -3,6 +3,7 @@
* 认证面板:顶层 switch(Facebook / Email)+ 悬浮返回按钮
*/
import { useRouter } from "next/navigation";
+import { ChevronLeft } from "lucide-react";
import { useAuthDispatch, useAuthState } from "@/stores/auth/auth-context";
@@ -36,19 +37,7 @@ export function AuthPanel() {
onClick={handleBack}
aria-label="Back"
>
-
+
{state.authPanelMode === "facebook" ? (
diff --git a/src/app/auth/components/auth-provider-icon.tsx b/src/app/auth/components/auth-provider-icon.tsx
new file mode 100644
index 00000000..cf8367cf
--- /dev/null
+++ b/src/app/auth/components/auth-provider-icon.tsx
@@ -0,0 +1,35 @@
+"use client";
+
+import { FaApple, FaFacebookF } from "react-icons/fa6";
+import { FcGoogle } from "react-icons/fc";
+
+export type AuthProviderIconName = "facebook" | "google" | "apple";
+
+export interface AuthProviderIconProps {
+ provider: AuthProviderIconName;
+ size?: number;
+ className?: string;
+}
+
+export function AuthProviderIcon({
+ provider,
+ size = 20,
+ className,
+}: AuthProviderIconProps) {
+ if (provider === "google") {
+ return ;
+ }
+
+ if (provider === "apple") {
+ return ;
+ }
+
+ return (
+
+ );
+}
diff --git a/src/app/auth/components/auth-social-buttons.tsx b/src/app/auth/components/auth-social-buttons.tsx
index 8c262872..7ee28dc2 100644
--- a/src/app/auth/components/auth-social-buttons.tsx
+++ b/src/app/auth/components/auth-social-buttons.tsx
@@ -8,6 +8,7 @@
*/
import { type ReactNode } from "react";
+import { AuthProviderIcon } from "./auth-provider-icon";
import styles from "./auth-social-buttons.module.css";
export interface AuthSocialButtonsProps {
@@ -37,10 +38,7 @@ export function AuthSocialButtons({
disabled={loadingProvider !== null && loadingProvider !== "facebook"}
>
- {/* Facebook "f" logo placeholder */}
-
+
Continue with Facebook
@@ -55,25 +53,7 @@ export function AuthSocialButtons({
disabled={loadingProvider !== null && loadingProvider !== "google"}
>
- {/* Google "G" logo placeholder */}
-
+
Continue with Google
@@ -87,9 +67,7 @@ export function AuthSocialButtons({
disabled={loadingProvider !== null && loadingProvider !== "apple"}
>
-
+
Continue with Apple
diff --git a/src/app/auth/components/index.ts b/src/app/auth/components/index.ts
index 275030b7..45497f29 100644
--- a/src/app/auth/components/index.ts
+++ b/src/app/auth/components/index.ts
@@ -11,6 +11,7 @@ export * from "./auth-legal-text";
export * from "./auth-other-options-dialog";
export * from "./auth-panel";
export * from "./auth-primary-button";
+export * from "./auth-provider-icon";
export * from "./auth-social-button";
export * from "./auth-social-buttons";
export * from "./auth-text-field";