Files
WRNexusJS/packages/auth/components/SignIn.wrn
T
Clintchiz cd0dffa87d
Quality / quality (ubuntu-latest) (push) Failing after 11m17s
Quality / quality (windows-latest) (push) Canceled after 0s
feat: complete SSR CRM and refine auth UI
2026-08-20 16:17:59 +05:30

80 lines
4.2 KiB
Plaintext

import PasskeyButton from "./PasskeyButton.wrn"
import { Button, Checkbox, Input, TogglePassword } from "@wrnexus/ui"
component SignIn {
props {
action = "/api/auth/login"
schema = "auth-login"
returnTo = "/"
redirect = ""
mfaHref = "/two-factor"
title = "Welcome back"
description = "Sign in to continue to your account."
identifierLabel = "Email, phone, or username"
identifierPlaceholder = "Enter your email, mobile number, or username"
passwordLabel = "Password"
passwordPlaceholder = "Enter your password"
submitLabel = "Sign in"
forgotHref = "/recover"
signUpHref = "/sign-up"
showRemember = true
showPasskey = true
showSignUp = true
color = "primary"
size = "md"
class = ""
}
view {
<section {...attrs} data-wrnexus-runtime="auth" data-auth-sign-in data-mfa-href='{mfaHref}' class='wrn-auth-sign-in w-full max-w-md rounded-[var(--wrn-radius-lg)] border border-[var(--wrn-color-border)] bg-[var(--wrn-color-surface)] p-6 text-[var(--wrn-color-text)] shadow-[var(--wrn-shadow-2)] {class}'>
<header class="wrn-auth-sign-in__header mb-6 space-y-1.5">
<h1 class="m-0 text-2xl font-semibold tracking-tight">{title}</h1>
<p class="m-0 text-sm text-[var(--wrn-color-muted)]">{description}</p>
</header>
<form method="post" action='{action}' data-schema='{schema}' data-redirect='{redirect}' novalidate class="wrn-auth-sign-in__form">
<input type="hidden" name="returnTo" value='{returnTo}' />
<input type="hidden" name="deviceFingerprint" value="" />
<input type="hidden" name="deviceName" value="" />
<Input id="auth-sign-in-identifier" name="identifier" type="text" label="{identifierLabel}" autocomplete="username webauthn" placeholder="{identifierPlaceholder}" icon="icon-[lucide--at-sign]" color="{color}" size="{size}" />
<div>
<TogglePassword
label="{passwordLabel}"
cornerHint="Forgot password?"
cornerHref="{forgotHref}"
name="password"
placeholder="{passwordPlaceholder}"
autocomplete="current-password"
pattern=""
color="{color}"
size="{size}"
/>
</div>
{#if showRemember}<div class="wrn-auth-sign-in__remember"><Checkbox id="auth-sign-in-remember" name="rememberDevice" label="Trust this device" color="{color}" size="{size}" /></div>{/if}
<slot></slot>
<p data-error="_form" role="alert" class="m-0 hidden rounded-[var(--wrn-radius-sm)] bg-[color-mix(in_srgb,var(--wrn-color-danger)_10%,transparent)] p-3 text-sm text-[var(--wrn-color-danger)]"></p>
<Button type="submit" label="{submitLabel}" variant="solid" color="{color}" size="{size}" fullWidth="true" />
</form>
{#if showPasskey}
<div class="my-4 flex items-center gap-3 text-xs text-[var(--wrn-color-muted)]"><span class="h-px flex-1 bg-[var(--wrn-color-border)]"></span><span>or</span><span class="h-px flex-1 bg-[var(--wrn-color-border)]"></span></div>
<PasskeyButton mode="authenticate" identifier="" mfaHref='{mfaHref}' fullWidth="true" />
{/if}
{#if showSignUp}
<p class="mb-0 mt-5 text-center text-sm text-[var(--wrn-color-muted)]">New here? <a href='{signUpHref}' class="font-semibold text-[var(--wrn-color-primary)] hover:underline">Create an account</a></p>
{/if}
</section>
}
style {
.wrn-auth-sign-in__header { margin-bottom: 1.5rem; }
.wrn-auth-sign-in__header h1 { font-size: 1.75rem; line-height: 1.15; }
.wrn-auth-sign-in__header p { margin-top: 0.35rem; font-size: 0.9375rem; line-height: 1.5; }
.wrn-auth-sign-in__form { display: grid; gap: 1.15rem; }
.wrn-auth-sign-in__form > * { margin: 0 !important; }
.wrn-auth-sign-in__remember { margin-top: -0.25rem !important; }
.wrn-auth-sign-in__form .wrn-next__field-heading label,
.wrn-auth-sign-in__form .wrn-next__password-heading { font-size: 0.875rem; font-weight: 650; }
.wrn-auth-sign-in__form .wrn-next__field-control > input { min-height: 3rem; font-size: 0.875rem; }
.wrn-auth-sign-in__form [data-error]:empty { display: none; }
.wrn-auth-sign-in__form .wrn-action[data-full-width="true"] { margin-top: 0.15rem !important; }
}
}