WebberUI

Auth Pages

登入/註冊頁組,含欄位展開收合、標題與按鈕文字morph、送出載入狀態等表單動效。

載入預覽⋯

Playground

即時調整 props、程式碼片段同步更新——直接試出你要的樣子再複製。

<AuthPages />

安裝

npx shadcn@latest add https://webberui.com/r/auth-pages.json

或在 components.json 設定 registries 後,改用 @webberui/auth-pages 安裝。

安裝依賴後,從 registry JSON(/r/auth-pages.jsonfiles[0].content)複製 auth-pages.tsx 原始碼到你的 components/ui/ 目錄:

npm install motion lucide-react clsx tailwind-merge

使用

import { AuthPages } from "@/components/ui/auth-pages";
import { Apple, Mail } from "lucide-react";

<AuthPages
  defaultMode="login"
  onSubmit={async (mode, values) => {
    await signIn(mode, values);
  }}
  onSocial={(id) => oauth(id)}
  socialProviders={[
    { id: "email", label: "Email", icon: Mail },
    { id: "apple", label: "Apple", icon: Apple },
  ]}
/>;

受控模式

不傳 mode 時由元件自行管理登入/註冊狀態(非受控)。若要與路由或外部狀態同步,改用受控寫法:

const [mode, setMode] = React.useState<AuthMode>("login");

<AuthPages mode={mode} onModeChange={setMode} onSubmit={handleSubmit} />;

split 款式

variant="split" 會在寬螢幕左側加上流動漸層的品牌側欄,窄螢幕自動收合為單欄卡片。可用 aside 覆寫側欄內容。

<AuthPages variant="split" aside={<MyBrandPanel />} onSubmit={handleSubmit} />;

Props

Prop型別預設值說明
mode"login" | "signup"受控目前模式;未提供時為非受控
defaultMode"login" | "signup""login"非受控時的初始模式
onModeChange(mode) => void模式切換時觸發
onSubmit(mode, values) => void | Promise<void>送出表單;回傳 Promise 時顯示載入狀態
onSocial(providerId) => void點擊社群登入按鈕時觸發
variant"card" | "split""card"版面款式
brandReactNode卡片頂端品牌區塊
socialProvidersAuthSocialProvider[]社群登入清單;留空不顯示
asideReactNodesplit 款式側欄內容
classNamestring外層容器樣式

onSubmitvaluesAuthSubmitValues:登入模式含 emailpasswordremember;註冊模式改含 nameemailpasswordconfirmPassword

動效細節

  • 掛載時卡片內容以 stagger 依序淡入上移
  • 切換模式時,姓名與確認密碼欄位以 spring 展開/收合高度,登入專屬的「記住我/忘記密碼」列同步替換
  • 標題與送出按鈕文字以 morph 過場切換,送出中顯示旋轉載入圖示

可及性

  • 表單以 aria-labelledby 關聯標題,欄位皆有對應 <label>autoComplete
  • 密碼顯示切換為真正的按鈕,帶 aria-labelaria-pressed
  • 中文等 IME 組字期間按 Enter 不會誤送出表單(含 Safari keyCode 229 情境)
  • 使用者開啟「減少動態效果」時,進場、欄位展開與文字 morph 皆改為瞬間切換,側欄漸層停止流動

On this page