Skip to content

UI Library

Overview

@authrim/sveltekit/ui provides 30+ pre-built Svelte components for building authentication UIs. All components are:

  • Themeable — CSS custom properties (--authrim-*)
  • Accessible — ARIA roles, focus management, keyboard navigation
  • Dark mode ready — Light/dark themes via [data-theme="dark"]
  • Zero dependencies — Pure Svelte, no external UI library required
import { Button, Input, Card, EmailCodeForm } from '@authrim/sveltekit/ui';
import '@authrim/sveltekit/ui/styles'; // Theme CSS

Component Catalog

Shared Components

ComponentPropsDescription
Buttonvariant, size, loading, disabled, fullWidth, typePrimary action button with variants and loading spinner
Inputtype, size, value, placeholder, error, errorMessage, label, requiredText input with label, error state, and validation
Cardpadding, bordered, shadow, hoverableContainer with header/footer slots
Dialogopen, title, closeOnOverlay, closeOnEscapeModal dialog with focus trap and overlay
Badgevariant, dotStatus indicator with color variants
SpinnersizeLoading spinner animation
Alertvariant, dismissibleAlert message (success/error/warning/info)
LanguageSwitcherlanguages, currentLanguage selection dropdown
CountdownTimerseconds, formatCountdown display

Helper Components

ComponentPropsDescription
AuthErrormessage, dismissibleError display with dismiss button and role="alert"
OTPInputlength, value, disabled, error, autoFocusSegmented code input with paste support and auto-advance
ResendCodeButtonremainingTime, text, loading, disabledResend button with countdown timer
DividertextVisual separator with optional text

Form Components

ComponentPropsDescription
EmailCodeFormstep, email, maskedEmail, loading, error, resendRemainingTimeTwo-step email + code form
SocialLoginButtonsproviders, layout, loading, loadingProvider, compactProvider buttons with icons
PasskeyLoginButtonloading, disabledPasskey sign-in button
PasskeySignUpFormloading, errorPasskey registration form
SignUpFormstep, loading, errorMulti-method signup form
ConsentScopesListscopesOAuth scope display list
ConsentFormclientInfo, scopes, loadingFull consent form
DeviceFlowFormloading, errorDevice code entry form

Passkey Management

ComponentPropsDescription
PasskeyListpasskeys, loading, deletingIdList of registered passkeys with delete
PasskeyItempasskey, deletingSingle passkey display
AddPasskeyButtonloadingRegister new passkey button

Session Management

ComponentPropsDescription
SessionListsessions, currentSessionId, loading, revokingIdActive session list with revoke
SessionItemsession, isCurrent, revokingSingle session display
RevokeSessionButtonsessionId, loadingRevoke session button

Account Management

ComponentPropsDescription
LinkedAccountsListaccounts, loadingLinked social accounts
LinkAccountButtonprovider, loadingLink new social account
UnlinkAccountButtonaccountId, loadingUnlink social account

Key Components in Detail

Button

<script lang="ts">
import { Button } from '@authrim/sveltekit/ui';
</script>
<Button variant="primary" size="md" loading={false} onclick={handleClick}>
Sign In
</Button>
<Button variant="outline" fullWidth>
Continue with Email
</Button>
<Button variant="destructive" size="sm">
Delete Account
</Button>

Variants: primary, secondary, outline, ghost, destructive

Sizes: sm (34px), md (42px), lg (50px)

Input

<script lang="ts">
import { Input } from '@authrim/sveltekit/ui';
let email = $state('');
</script>
<Input
type="email"
label="Email address"
placeholder="[email protected]"
bind:value={email}
required
error={!email.includes('@')}
errorMessage="Invalid email address"
/>

OTPInput

<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('Current:', e.detail.value)}
/>

Features: Auto-advance between digits, paste support, arrow key navigation, shake animation on error.

EmailCodeForm

<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 = ''; }}
/>

SocialLoginButtons

<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)}
/>

Layouts: vertical (stacked), horizontal (row), grid (auto-fit)

Built-in icons: Google, Apple, Microsoft, GitHub, Facebook — each with branded colors.

PasskeyList

<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)}
/>

SessionList

<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)}
/>

Customization

1. CSS Custom Properties

Override theme variables to change the look:

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

2. Class Prop

Every component accepts a class prop:

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

3. Slots

Replace internal sections with slots:

<Card>
{#snippet header()}
<h2>Custom Header</h2>
{/snippet}
<p>Card body content</p>
{#snippet footer()}
<Button>Save</Button>
{/snippet}
</Card>

Theme Reference

Import the theme CSS to get the default styling:

import '@authrim/sveltekit/ui/styles';

Color Tokens

TokenLightDarkPurpose
--authrim-color-primary#4f46e5#818cf8Primary actions
--authrim-color-accent#f43f5e#fb7185Accent/highlight
--authrim-color-success#059669#34d399Success states
--authrim-color-warning#d97706#fbbf24Warning states
--authrim-color-error#e11d48#fb7185Error states
--authrim-color-info#0891b2#22d3eeInfo states
--authrim-color-bg#ffffff#09090bBackground
--authrim-color-text#09090b#fafafaText
--authrim-color-border#e4e4e7#27272aBorders

Layout Tokens

TokenValuePurpose
--authrim-radius-sm6pxSmall elements
--authrim-radius-md10pxButtons, inputs
--authrim-radius-lg14pxCards
--authrim-radius-xl20pxLarge containers
--authrim-shadow-smsubtleCards, inputs
--authrim-shadow-mdmoderateDialogs
--authrim-shadow-lgprominentDropdowns

Typography Tokens

TokenValue
--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

Dark Mode

Dark mode activates via [data-theme="dark"] or prefers-color-scheme: dark:

<!-- Manual toggle -->
<html data-theme="dark">
/* Auto-detection (default behavior) */
@media (prefers-color-scheme: dark) {
:root { /* dark tokens applied automatically */ }
}

Next Steps