コンテンツにスキップ

ページテンプレート

@authrim/sveltekit/ui/templates は7つのページテンプレートを提供します — 完全にスタイル付けされたレスポンシブなリファレンス実装で、そのまま使用するか、コピーしてカスタマイズできます。

import {
LoginTemplate,
SignUpTemplate,
AccountSettingsTemplate,
ConsentTemplate,
DeviceFlowTemplate,
CIBATemplate,
ReauthTemplate,
} from '@authrim/sveltekit/ui/templates';

すべてのテンプレートはUIライブラリのコンポーネントを使用し、--authrim-* CSSカスタムプロパティに準拠します。

Passkey、メールコード、ソーシャルログインオプションを含む完全なログインページ。

src/routes/login/+page.svelte
<script lang="ts">
import { LoginTemplate } from '@authrim/sveltekit/ui/templates';
import { getAuthContext } from '@authrim/sveltekit';
import { goto } from '$app/navigation';
const auth = getAuthContext();
let loading = $state(false);
let loadingProvider = $state<string | undefined>(undefined);
let error = $state('');
async function handlePasskeyLogin() {
loading = true;
error = '';
const { error: err } = await auth.passkey.login();
loading = false;
if (err) { error = err.message; return; }
goto('/');
}
async function handleSocialLogin(e: CustomEvent<{ provider: string }>) {
const provider = e.detail.provider;
loadingProvider = provider;
error = '';
const { error: err } = await auth.social.loginWithPopup(provider);
loadingProvider = undefined;
if (err) { error = err.message; return; }
goto('/');
}
</script>
<LoginTemplate
availableProviders={['google', 'github', 'apple']}
enablePasskey={true}
enableEmailCode={true}
{loading}
{loadingProvider}
{error}
title="おかえりなさい"
subtitle="アカウントにサインイン"
on:passkey-login={handlePasskeyLogin}
on:social-login={handleSocialLogin}
on:email-submit={(e) => sendCode(e.detail.email)}
on:code-submit={(e) => verifyCode(e.detail.code)}
on:code-resend={resendCode}
on:dismiss-error={() => { error = ''; }}
/>
Propデフォルト説明
availableProvidersSocialProvider[][]表示するソーシャルプロバイダー
enablePasskeybooleantruePasskeyログインオプションを表示
enableEmailCodebooleantrueメールコードオプションを表示
loadingbooleanfalse全体のローディング状態
loadingProviderSocialProvider | undefined現在ロード中のプロバイダー
errorstring''表示するエラーメッセージ
titlestring'Welcome back'ページタイトル
subtitlestring'Sign in to your account'ページサブタイトル
イベントペイロード説明
passkey-loginPasskeyログイン要求
social-login{ provider }ソーシャルログイン要求
email-submit{ email }メールコード送信要求
code-submit{ code }コード検証要求
code-resendコード再送信要求
dismiss-errorエラー非表示
メソッド説明
setEmailStep(step)親からメールフォームのステップ('email' or 'code')を制御
  • フルハイトグラデーション背景上の中央配置カード(max-width: 420px)
  • 区切り線でセクション分離:Passkey → メールコード → ソーシャル
  • フッターに「アカウントをお持ちでない方は サインアップ」リンク

Passkeyとメールコードオプションのマルチメソッドサインアップページ。

<SignUpTemplate
availableProviders={['google', 'github']}
enablePasskey={true}
enableEmailCode={true}
{loading}
{error}
on:passkey-signup={(e) => signUpWithPasskey(e.detail)}
on:social-signup={(e) => socialSignup(e.detail.provider)}
on:email-submit={(e) => sendSignupCode(e.detail)}
on:code-submit={(e) => verifySignupCode(e.detail.code)}
on:dismiss-error={() => { error = ''; }}
/>
Propデフォルト説明
availableProvidersSocialProvider[][]ソーシャルプロバイダー
enablePasskeybooleantruePasskeyオプションを表示
enableEmailCodebooleantrueメールオプションを表示
loadingbooleanfalseローディング状態
errorstring''エラーメッセージ
titlestring'Create account'ページタイトル

passkey-signup, social-signup, email-submit, code-submit, code-resend, dismiss-error

Passkey一覧、セッション一覧、プロフィール情報のアカウント管理ページ。

<AccountSettingsTemplate
passkeys={passkeyList}
sessions={sessionList}
currentSessionId={currentSessId}
on:passkey-register={handleAddPasskey}
on:passkey-delete={(e) => deletePasskey(e.detail.credentialId)}
on:session-revoke={(e) => revokeSession(e.detail.sessionId)}
on:account-link={(e) => linkAccount(e.detail.provider)}
on:account-unlink={(e) => unlinkAccount(e.detail.accountId)}
/>
Prop説明
passkeysPasskeyItemDisplay[]登録済みPasskey
sessionsSessionItemDisplay[]アクティブセッション
linkedAccountsLinkedAccountDisplay[]連携済みソーシャルアカウント
currentSessionIdstring | undefined現在のセッションID
loadingboolean全体のローディング
passkeyLoadingbooleanPasskeyセクションのローディング
deletingPasskeyIdstring | undefined削除中のPasskey
revokingSessionIdstring | undefined失効中のセッション
unlinkingAccountIdstring | undefined解除中の連携アカウント
linkableProvidersSocialProvider[]連携可能なプロバイダー
linkingProviderSocialProvider | undefined連携中のプロバイダー

passkey-register, passkey-delete, session-revoke, account-link, account-unlink

クライアント情報、要求スコープ、許可/拒否ボタンのOAuth同意画面。

<script lang="ts">
import { ConsentTemplate } from '@authrim/sveltekit/ui/templates';
import { getAuthContext } from '@authrim/sveltekit';
import { page } from '$app/stores';
const auth = getAuthContext();
const challengeId = $page.url.searchParams.get('challenge');
let consentData = $state(null);
$effect(() => {
if (challengeId) {
auth.consent.getData(challengeId).then(data => {
consentData = data;
});
}
});
</script>
{#if consentData}
<ConsentTemplate
client={consentData.client}
scopes={consentData.scopes}
user={consentData.user}
organizations={consentData.organizations}
selectedOrgId={consentData.target_org_id}
roles={consentData.roles}
actingAs={consentData.acting_as}
showOrgSelector={consentData.features.org_selector_enabled}
showActingAs={consentData.features.acting_as_enabled}
showRoles={consentData.features.show_roles}
on:allow={(e) => auth.consent.submit(challengeId, {
approve: true,
selectedOrgId: e.detail.selectedOrgId,
actingAsUserId: e.detail.actingAsUserId,
})}
on:deny={() => auth.consent.submit(challengeId, { approve: false })}
/>
{/if}
Prop説明
clientConsentClientInfo | null要求元クライアント情報
scopesConsentScopeInfo[]要求スコープ
userConsentUserInfo | null現在のユーザー情報
organizationsConsentOrgInfo[]grant対象として選べる組織
selectedOrgIdstring | null選択中の組織ID
rolesstring[]表示するロール
actingAsConsentActingAsInfo | nulldelegated access context
loadingbooleanローディング状態

allow, deny, switch-account, org-change, dismiss-error

デバイス認可コード入力画面(RFC 8628)。

<script lang="ts">
import { DeviceFlowTemplate } from '@authrim/sveltekit/ui/templates';
import { getAuthContext } from '@authrim/sveltekit';
const auth = getAuthContext();
async function handleSubmit(e: CustomEvent<{ userCode: string }>) {
const result = await auth.deviceFlow.submit(e.detail.userCode, true);
// result.message にサーバーの確認メッセージが入ります。
}
</script>
<DeviceFlowTemplate
on:approve={handleSubmit}
on:deny={(e) => auth.deviceFlow.submit(e.detail.userCode, false)}
/>
Prop説明
loadingbooleanローディング状態
errorstringエラーメッセージ
successstring成功メッセージ
initialCodestring初期入力するユーザーコード
qrCodeUrlstringQRコード画像URL
verificationUrlstringQRコードと一緒に表示する検証URL

approve, deny, code-change, dismiss-error, dismiss-success

CIBA(Client Initiated Backchannel Authentication)承認画面。

<script lang="ts">
import { CIBATemplate } from '@authrim/sveltekit/ui/templates';
import { getAuthContext } from '@authrim/sveltekit';
const auth = getAuthContext();
let requests = $state([]);
$effect(() => {
auth.ciba.getData('[email protected]').then(data => {
requests = data;
});
});
</script>
<CIBATemplate
{requests}
on:approve={(e) => auth.ciba.approve(e.detail.authReqId, userId, sub)}
on:deny={(e) => auth.ciba.reject(e.detail.authReqId)}
on:refresh={loadRequests}
/>
Prop説明
requestsCIBAPendingRequest[]保留中のCIBAリクエスト
loadingbooleanローディング状態
errorstringエラーメッセージ
successstring成功メッセージ

approve{ authReqId } 付き)、deny{ authReqId } 付き)、refreshdismiss-errordismiss-success

機密操作のための再認証プロンプト。

Prop説明
enablePasskeybooleanPasskeyオプションを表示
enableEmailCodebooleanメールコードオプションを表示
loadingbooleanローディング状態
errorstringエラーメッセージ
titlestringページタイトル

passkey-login, email-submit, code-submit, dismiss-error

すべてのテンプレートは --authrim-* CSSカスタムプロパティを使用します。ブランドに合わせてオーバーライド:

:root {
/* プライマリブランドカラー */
--authrim-color-primary: #0066cc;
--authrim-color-primary-hover: #0052a3;
--authrim-color-primary-active: #003d7a;
--authrim-color-primary-subtle: #e6f0ff;
--authrim-color-primary-text: #ffffff;
/* 背景 */
--authrim-color-bg: #ffffff;
--authrim-color-bg-subtle: #f8fafc;
/* タイポグラフィ */
--authrim-font-sans: 'Inter', system-ui, sans-serif;
/* ボーダー半径 */
--authrim-radius-lg: 12px;
}

テンプレートはフルビューポート高さで中央配置カードレイアウトと微妙なグラデーション背景を使用します。