コンテンツにスキップ

UIライブラリ

@authrim/sveltekit/ui は認証UIを構築するための30以上のプリビルドSvelteコンポーネントを提供します。すべてのコンポーネントは:

  • テーマ対応 — CSSカスタムプロパティ(--authrim-*
  • アクセシブル — ARIAロール、フォーカス管理、キーボードナビゲーション
  • ダークモード対応[data-theme="dark"] でライト/ダークテーマ
  • 依存関係なし — 純粋なSvelte、外部UIライブラリ不要
import { Button, Input, Card, EmailCodeForm } from '@authrim/sveltekit/ui';
import '@authrim/sveltekit/ui/styles'; // テーマCSS
コンポーネントProps説明
Buttonvariant, size, loading, disabled, fullWidth, typeバリアントとローディングスピナー付きアクションボタン
Inputtype, size, value, placeholder, error, errorMessage, label, requiredラベル、エラー状態、バリデーション付きテキスト入力
Cardpadding, bordered, shadow, hoverableヘッダー/フッタースロット付きコンテナ
Dialogopen, title, closeOnOverlay, closeOnEscapeフォーカストラップとオーバーレイ付きモーダルダイアログ
Badgevariant, dotカラーバリアント付きステータスインジケーター
Spinnersizeローディングスピナーアニメーション
Alertvariant, title, dismissibleアラートメッセージ(success/error/warning/info)
LanguageSwitcherlocales, currentLocale言語選択ドロップダウン
CountdownTimerexpiresAt, size, showIcon, warnAt, criticalAtカウントダウン表示
コンポーネントProps説明
AuthErrormessage, dismissiblerole="alert" 付きエラー表示(閉じるボタン付き)
OTPInputlength, value, disabled, error, autoFocusペースト対応・自動進行の分割コード入力
ResendCodeButtonremainingTime, text, loading, disabledカウントダウンタイマー付き再送信ボタン
コンポーネントProps説明
EmailCodeFormstep, email, maskedEmail, loading, error, resendRemainingTime2ステップのメール+コードフォーム
SocialLoginButtonsproviders, layout, loading, loadingProvider, compactアイコン付きプロバイダーボタン
PasskeyConditionalInputvalue, placeholder, disabled, size, label, showPasskeyHintWebAuthn autofill向けのユーザー名入力
UserCodeInputvalue, disabled, placeholder, label, hintDevice Flowユーザーコード入力
QRCodeDisplaydata, imageUrl, size, label, captionQRコード表示ラッパー
ClientInfoclient, trustedLabel, privacyPolicyLabel, termsLabelOAuthクライアント情報表示
ConsentScopesListscopes, labelMapOAuthスコープ表示リスト
OrgSelectororganizations, selectedOrgId, label, primaryLabel同意画面の組織セレクター
CIBARequestCardrequest, loading, approveLabel, denyLabel単一CIBA承認カード
コンポーネントProps説明
PasskeyListpasskeys, loading, deletingId削除機能付き登録済みPasskey一覧
PasskeyRegisterButtonloading, disabled, variant, size, fullWidth新規Passkey登録ボタン
PasskeyDeleteButtoncredentialId, loadingPasskey削除確認ボタン
コンポーネントProps説明
SessionListsessions, currentSessionId, loading, revokingId取消機能付きアクティブセッション一覧
SessionRevokeButtonsessionId, loadingセッション取消ボタン
SessionExpiryIndicatorexpiresAtセッション有効期限表示
コンポーネントProps説明
LinkedAccountsListaccounts, loading連携ソーシャルアカウント
LinkAccountButtonprovider, loading新規ソーシャルアカウント連携
UnlinkAccountButtonaccountId, provider, loadingソーシャルアカウント連携解除
<script lang="ts">
import { Button } from '@authrim/sveltekit/ui';
</script>
<Button variant="primary" size="md" loading={false} onclick={handleClick}>
サインイン
</Button>
<Button variant="outline" fullWidth>
メールで続行
</Button>
<Button variant="destructive" size="sm">
アカウント削除
</Button>

バリアント: primary, secondary, outline, ghost, destructive

サイズ: sm(34px)、md(42px)、lg(50px)

<script lang="ts">
import { Input } from '@authrim/sveltekit/ui';
let email = $state('');
</script>
<Input
type="email"
label="メールアドレス"
placeholder="[email protected]"
bind:value={email}
required
error={!email.includes('@')}
errorMessage="無効なメールアドレスです"
/>
<script lang="ts">
import { OTPInput } from '@authrim/sveltekit/ui';
</script>
<OTPInput
length={6}
autoFocus
on:complete={(e) => verifyCode(e.detail.value)}
on:input={(e) => console.log('現在値:', e.detail.value)}
/>

機能: 数字間の自動進行、ペースト対応、矢印キーナビゲーション、エラー時のシェイクアニメーション。

<script lang="ts">
import { EmailCodeForm } from '@authrim/sveltekit/ui';
let step: 'email' | 'code' = $state('email');
let email = $state('');
let loading = $state(false);
</script>
<EmailCodeForm
{step}
{email}
{loading}
on:submit-email={(e) => sendCode(e.detail.email)}
on:submit-code={(e) => verifyCode(e.detail.code)}
on:back={() => { step = 'email'; }}
on:resend={() => resendCode()}
on:dismiss-error={() => { error = ''; }}
/>
<script lang="ts">
import { SocialLoginButtons } from '@authrim/sveltekit/ui';
</script>
<SocialLoginButtons
providers={['google', 'github', 'apple']}
layout="vertical"
on:click={(e) => auth.social.loginWithPopup(e.detail.provider)}
/>

レイアウト: vertical(縦並び)、horizontal(横並び)、grid(自動配置)

組み込みアイコン: Google、Apple、Microsoft、GitHub、Facebook — 各ブランドカラー付き。

<script lang="ts">
import { PasskeyList } from '@authrim/sveltekit/ui';
</script>
<PasskeyList
passkeys={[
{ credentialId: 'abc', name: 'MacBook Pro', deviceType: 'platform',
createdAt: new Date('2024-01-15'), lastUsedAt: new Date('2024-06-01') },
]}
on:delete={(e) => deletePasskey(e.detail.credentialId)}
/>
<script lang="ts">
import { SessionList } from '@authrim/sveltekit/ui';
</script>
<SessionList
sessions={[
{ sessionId: 'sess_1', browser: 'Chrome', os: 'macOS',
lastActiveAt: new Date(), isCurrent: true },
{ sessionId: 'sess_2', browser: 'Safari', os: 'iOS',
lastActiveAt: new Date('2024-05-20') },
]}
currentSessionId="sess_1"
on:revoke={(e) => revokeSession(e.detail.sessionId)}
/>

テーマ変数をオーバーライドして外観を変更:

:root {
--authrim-color-primary: #0066cc;
--authrim-color-primary-hover: #0052a3;
--authrim-radius-md: 8px;
--authrim-font-sans: 'Inter', sans-serif;
}

すべてのコンポーネントは class propを受け付けます:

<Button class="my-custom-button" variant="primary">
送信
</Button>
<style>
:global(.my-custom-button) {
text-transform: uppercase;
letter-spacing: 0.05em;
}
</style>

内部セクションをスロットで置き換え:

<Card>
{#snippet header()}
<h2>カスタムヘッダー</h2>
{/snippet}
<p>カード本文</p>
{#snippet footer()}
<Button>保存</Button>
{/snippet}
</Card>

テーマCSSをインポートしてデフォルトスタイルを適用:

import '@authrim/sveltekit/ui/styles';
トークンライトダーク用途
--authrim-color-primary#4f46e5#818cf8プライマリアクション
--authrim-color-accent#f43f5e#fb7185アクセント/ハイライト
--authrim-color-success#059669#34d399成功状態
--authrim-color-warning#d97706#fbbf24警告状態
--authrim-color-error#e11d48#fb7185エラー状態
--authrim-color-info#0891b2#22d3ee情報状態
--authrim-color-bg#ffffff#09090b背景
--authrim-color-text#09090b#fafafaテキスト
--authrim-color-border#e4e4e7#27272aボーダー
トークン用途
--authrim-radius-sm6px小さい要素
--authrim-radius-md10pxボタン、入力
--authrim-radius-lg14pxカード
--authrim-radius-xl20px大きいコンテナ
--authrim-shadow-sm微妙カード、入力
--authrim-shadow-md中程度ダイアログ
--authrim-shadow-lg目立つドロップダウン
トークン
--authrim-font-sans'DM Sans', system-ui, sans-serif
--authrim-font-mono'JetBrains Mono', monospace
--authrim-text-sm0.875rem
--authrim-text-base1rem
--authrim-text-lg1.125rem

ダークモードは [data-theme="dark"] または prefers-color-scheme: dark で有効化:

<!-- 手動トグル -->
<html data-theme="dark">
/* 自動検知(デフォルト動作) */
@media (prefers-color-scheme: dark) {
:root { /* ダークトークンが自動適用 */ }
}