Save workspace changes
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
@extends('layouts.nova')
|
||||
|
||||
@section('content')
|
||||
<div class="flex-1 flex items-center justify-center px-6 py-16 min-h-[calc(100vh-4rem)] box-border">
|
||||
<div class="max-w-5xl w-full">
|
||||
<div class="rounded-2xl border border-white/10 bg-slate-900/70 backdrop-blur shadow-xl p-8 auth-card">
|
||||
<h2 class="text-2xl font-semibold mb-2 text-white">Confirm Password</h2>
|
||||
<p class="text-sm text-white/60 mb-6">Please confirm your password before continuing.</p>
|
||||
|
||||
<form method="POST" action="{{ route('password.confirm') }}" class="mt-4">
|
||||
@csrf
|
||||
|
||||
<div>
|
||||
<label class="block text-sm mb-1 text-white/80" for="password">Password</label>
|
||||
<x-text-input id="password" name="password" type="password" required autocomplete="current-password" class="w-full rounded-lg bg-slate-950/70 border border-white/10 px-4 py-3 text-sm focus:outline-none focus:ring-2 focus:ring-cyan-500 text-white" />
|
||||
|
||||
<x-input-error :messages="$errors->get('password')" class="mt-2" />
|
||||
</div>
|
||||
|
||||
<div class="flex justify-end mt-4">
|
||||
<x-primary-button>
|
||||
{{ __('Confirm') }}
|
||||
</x-primary-button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
@@ -0,0 +1,35 @@
|
||||
@extends('layouts.nova')
|
||||
|
||||
@section('content')
|
||||
<div class="flex-1 flex items-center justify-center px-6 py-16 min-h-[calc(100vh-4rem)] box-border">
|
||||
<div class="max-w-5xl w-full">
|
||||
<div class="rounded-2xl border border-white/10 bg-slate-900/70 backdrop-blur shadow-xl p-8 auth-card">
|
||||
<h2 class="text-2xl font-semibold mb-2 text-white">Reset Password</h2>
|
||||
<p class="text-sm text-white/60 mb-6">Enter your email and we'll send a link to reset your password.</p>
|
||||
|
||||
@include('auth.partials.help-links', [
|
||||
'title' => 'Need help recovering access?',
|
||||
'description' => 'Use the auth guide for recovery basics or the troubleshooting page if the issue still feels broader than a reset link.',
|
||||
'showLogin' => true,
|
||||
])
|
||||
|
||||
<x-auth-session-status class="mt-4 mb-2 text-green-300" :status="session('status')" />
|
||||
|
||||
<form method="POST" action="{{ route('password.email') }}" class="mt-4">
|
||||
@csrf
|
||||
|
||||
<div>
|
||||
<label class="block text-sm mb-1 text-white/80" for="email">Email</label>
|
||||
<x-text-input id="email" name="email" type="email" :value="old('email')" required autofocus class="w-full rounded-lg bg-slate-950/70 border border-white/10 px-4 py-3 text-sm focus:outline-none focus:ring-2 focus:ring-cyan-500 text-white" />
|
||||
<x-input-error :messages="$errors->get('email')" class="mt-2" />
|
||||
</div>
|
||||
|
||||
<div class="flex items-center justify-end mt-4">
|
||||
<x-primary-button>
|
||||
{{ __('Email Password Reset Link') }}
|
||||
</x-primary-button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
@@ -0,0 +1,88 @@
|
||||
@extends('layouts.nova')
|
||||
|
||||
@section('content')
|
||||
<div class="flex-1 flex items-center justify-center px-6 py-16 min-h-[calc(100vh-4rem)] box-border">
|
||||
<div class="max-w-5xl w-full">
|
||||
<div class="rounded-2xl border border-white/10 bg-slate-900/70 backdrop-blur shadow-xl p-8 auth-card">
|
||||
<h2 class="text-2xl font-semibold mb-2 text-white">Login</h2>
|
||||
|
||||
<p class="text-sm text-white/60 mb-6">Access your Skinbase account.</p>
|
||||
|
||||
@include('auth.partials.help-links', [
|
||||
'title' => 'Need help signing in?',
|
||||
'description' => 'Use the signup and login guide or the troubleshooting page before spending time guessing at the wrong fix.',
|
||||
'showReset' => true,
|
||||
])
|
||||
|
||||
<x-auth-session-status class="mt-4 mb-2 text-green-300" :status="session('status')" />
|
||||
|
||||
@if($errors->has('oauth'))
|
||||
<div class="rounded-lg bg-red-900/40 border border-red-500/40 px-4 py-3 text-sm text-red-300 mb-4">
|
||||
{{ $errors->first('oauth') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if($errors->has('bot'))
|
||||
<div class="rounded-lg bg-red-900/40 border border-red-500/40 px-4 py-3 text-sm text-red-300 mb-4">
|
||||
{{ $errors->first('bot') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@include('auth.partials.social-login')
|
||||
|
||||
<form method="POST" action="{{ route('login') }}" class="space-y-5" data-bot-form>
|
||||
@csrf
|
||||
<input type="text" name="homepage_url" value="" tabindex="-1" autocomplete="off" class="hidden" aria-hidden="true">
|
||||
<input type="hidden" name="_bot_fingerprint" value="">
|
||||
|
||||
@php
|
||||
$captchaProvider = $captcha['provider'] ?? 'turnstile';
|
||||
$captchaSiteKey = $captcha['siteKey'] ?? '';
|
||||
@endphp
|
||||
|
||||
<div>
|
||||
<label class="block text-sm mb-1 text-white/80" for="email">Email</label>
|
||||
<input id="email" name="email" type="email" required placeholder="you@example.com" value="{{ old('email') }}" class="w-full rounded-lg bg-slate-950/70 border border-white/10 px-4 py-3 text-sm focus:outline-none focus:ring-2 focus:ring-purple-500 text-white" />
|
||||
<x-input-error :messages="$errors->get('email')" class="mt-2" />
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block text-sm mb-1 text-white/80" for="password">Password</label>
|
||||
<input id="password" name="password" type="password" required placeholder="••••••••••" class="w-full rounded-lg bg-slate-950/70 border border-white/10 px-4 py-3 text-sm focus:outline-none focus:ring-2 focus:ring-purple-500 text-white" />
|
||||
<x-input-error :messages="$errors->get('password')" class="mt-2" />
|
||||
</div>
|
||||
|
||||
@if(($requiresCaptcha ?? false) && $captchaSiteKey !== '')
|
||||
@if($captchaProvider === 'recaptcha')
|
||||
<div class="g-recaptcha" data-sitekey="{{ $captchaSiteKey }}" data-theme="dark"></div>
|
||||
@elseif($captchaProvider === 'hcaptcha')
|
||||
<div class="h-captcha" data-sitekey="{{ $captchaSiteKey }}" data-theme="dark"></div>
|
||||
@else
|
||||
<div class="cf-turnstile" data-sitekey="{{ $captchaSiteKey }}" data-theme="dark"></div>
|
||||
@endif
|
||||
<x-input-error :messages="$errors->get('captcha')" class="mt-2" />
|
||||
@endif
|
||||
|
||||
<div class="flex items-center justify-between text-sm text-white/60">
|
||||
<label class="flex items-center gap-2">
|
||||
<input type="checkbox" name="remember" class="rounded bg-slate-800 border-white/20" />
|
||||
Remember me
|
||||
</label>
|
||||
|
||||
@if (Route::has('password.request'))
|
||||
<a href="{{ route('password.request') }}" class="text-purple-400 hover:underline">Forgot password?</a>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<button type="submit" class="w-full rounded-lg py-3 font-medium bg-gradient-to-r from-purple-500 to-pink-500 hover:from-purple-400 hover:to-pink-400 text-white transition">Sign In</button>
|
||||
|
||||
<p class="text-sm text-center text-white/60">Don’t have an account? <a href="{{ route('register') }}" class="text-purple-400 hover:underline">Create one</a></p>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@if(($requiresCaptcha ?? false) && (($captcha['siteKey'] ?? '') !== '') && (($captcha['scriptUrl'] ?? '') !== ''))
|
||||
<script src="{{ $captcha['scriptUrl'] }}" async defer></script>
|
||||
@endif
|
||||
@include('partials.bot-fingerprint-script')
|
||||
@endsection
|
||||
@@ -0,0 +1,24 @@
|
||||
@php
|
||||
$title = $title ?? 'Need help?';
|
||||
$description = $description ?? 'Use the help guides when the fastest next step is still unclear.';
|
||||
$showReset = $showReset ?? false;
|
||||
$showLogin = $showLogin ?? false;
|
||||
@endphp
|
||||
|
||||
<div class="mt-6 rounded-2xl border border-sky-400/15 bg-sky-400/10 p-4">
|
||||
<p class="text-[11px] font-semibold uppercase tracking-[0.18em] text-sky-200/80">{{ $title }}</p>
|
||||
<p class="mt-2 text-sm leading-6 text-slate-200/85">{{ $description }}</p>
|
||||
|
||||
<div class="mt-4 flex flex-wrap gap-3 text-sm">
|
||||
<a href="{{ route('help.auth') }}" class="rounded-full border border-white/10 bg-white/[0.05] px-4 py-2 font-semibold text-white transition hover:border-white/20 hover:bg-white/[0.08]">Read signup and login help</a>
|
||||
<a href="{{ route('help.troubleshooting') }}" class="rounded-full border border-white/10 bg-black/20 px-4 py-2 font-semibold text-slate-200 transition hover:border-white/20 hover:bg-white/[0.05]">Open troubleshooting</a>
|
||||
|
||||
@if($showReset)
|
||||
<a href="{{ route('password.request') }}" class="rounded-full border border-white/10 bg-black/20 px-4 py-2 font-semibold text-slate-200 transition hover:border-white/20 hover:bg-white/[0.05]">Reset password</a>
|
||||
@endif
|
||||
|
||||
@if($showLogin)
|
||||
<a href="{{ route('login') }}" class="rounded-full border border-white/10 bg-black/20 px-4 py-2 font-semibold text-slate-200 transition hover:border-white/20 hover:bg-white/[0.05]">Open login</a>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,27 @@
|
||||
@php
|
||||
$steps = [
|
||||
'email' => 'Email',
|
||||
'verified' => 'Verified',
|
||||
'password' => 'Password',
|
||||
'complete' => 'Username',
|
||||
];
|
||||
|
||||
$currentIndex = array_search($currentStep ?? 'email', array_keys($steps), true);
|
||||
if ($currentIndex === false) {
|
||||
$currentIndex = 0;
|
||||
}
|
||||
@endphp
|
||||
|
||||
<div class="mb-6">
|
||||
<div class="flex items-center justify-between text-xs sm:text-sm text-gray-600">
|
||||
@foreach($steps as $key => $label)
|
||||
@php $idx = array_search($key, array_keys($steps), true); @endphp
|
||||
<span class="{{ $idx <= $currentIndex ? 'text-gray-900 font-semibold' : '' }}">
|
||||
{{ $label }}
|
||||
</span>
|
||||
@endforeach
|
||||
</div>
|
||||
<div class="mt-2 h-2 w-full bg-gray-200 rounded-full overflow-hidden">
|
||||
<div class="h-full bg-gray-900 rounded-full" style="width: {{ (($currentIndex + 1) / count($steps)) * 100 }}%"></div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,34 @@
|
||||
{{-- Social login / register buttons for Google, Apple, Discord --}}
|
||||
<div class="space-y-3">
|
||||
{{-- Google --}}
|
||||
<a
|
||||
href="{{ route('oauth.redirect', 'google') }}"
|
||||
class="flex items-center justify-center gap-3 w-full rounded-lg border border-white/15 px-4 py-3 text-sm font-medium text-white hover:border-white/30 hover:bg-white/5 transition-colors duration-150"
|
||||
>
|
||||
<svg viewBox="0 0 24 24" class="w-5 h-5 shrink-0" aria-hidden="true">
|
||||
<path d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z" fill="#4285F4"/>
|
||||
<path d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z" fill="#34A853"/>
|
||||
<path d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z" fill="#FBBC05"/>
|
||||
<path d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z" fill="#EA4335"/>
|
||||
</svg>
|
||||
<span>Continue with Google</span>
|
||||
</a>
|
||||
|
||||
{{-- Discord --}}
|
||||
<a
|
||||
href="{{ route('oauth.redirect', 'discord') }}"
|
||||
class="flex items-center justify-center gap-3 w-full rounded-lg border border-white/15 px-4 py-3 text-sm font-medium text-white hover:border-white/30 hover:bg-white/5 transition-colors duration-150"
|
||||
>
|
||||
<svg viewBox="0 0 24 24" class="w-5 h-5 shrink-0" aria-hidden="true" fill="#5865F2">
|
||||
<path d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057c.002.022.015.04.033.05a19.89 19.89 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028 14.09 14.09 0 0 0 1.226-1.994.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z"/>
|
||||
</svg>
|
||||
<span>Continue with Discord</span>
|
||||
</a>
|
||||
|
||||
{{-- Divider --}}
|
||||
<div class="relative flex items-center py-1">
|
||||
<div class="flex-grow border-t border-white/10"></div>
|
||||
<span class="mx-3 text-xs text-white/40 whitespace-nowrap">{{ $dividerLabel ?? 'or continue with email' }}</span>
|
||||
<div class="flex-grow border-t border-white/10"></div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,88 @@
|
||||
@extends('layouts.nova')
|
||||
|
||||
@section('content')
|
||||
<div class="px-4 py-8 md:px-6 md:py-10">
|
||||
<div class="flex-1 flex items-center justify-center px-6 py-16 min-h-[calc(100vh-4rem)] box-border">
|
||||
<div class="max-w-5xl w-full">
|
||||
<div class="rounded-2xl border border-white/10 bg-slate-900/70 backdrop-blur shadow-xl p-8 auth-card">
|
||||
<div class="mb-4 text-sm text-white/80">
|
||||
<p class="font-medium text-white">Check your inbox</p>
|
||||
@if($email !== '')
|
||||
<p class="mt-1">We sent a verification link to <strong class="text-white">{{ $email }}</strong>.</p>
|
||||
<p class="mt-1">Click the link in that email to continue setup.</p>
|
||||
@else
|
||||
<p class="mt-1">Enter your email to resend verification if needed.</p>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
@if (session('status'))
|
||||
<div class="mb-4 rounded-md border border-green-700/60 bg-green-900/20 px-3 py-2 text-sm text-green-300">
|
||||
{{ session('status') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if ($errors->any())
|
||||
<div class="mb-4 rounded-md border border-red-700/60 bg-red-900/20 px-3 py-2 text-sm text-red-300">
|
||||
{{ $errors->first() }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<form method="POST" action="{{ route('register.resend') }}" class="space-y-4" id="resend-form" data-resend-seconds="{{ (int) $resendSeconds }}">
|
||||
@csrf
|
||||
|
||||
<div>
|
||||
<x-input-label for="email" value="Email" class="text-sb-muted" />
|
||||
<x-text-input id="email" class="block mt-1 w-full bg-black/20 border-sb-line text-white" type="email" name="email" :value="old('email', $email)" required autocomplete="email" />
|
||||
<x-input-error :messages="$errors->get('email')" class="mt-2" />
|
||||
</div>
|
||||
|
||||
<div class="flex items-center justify-between gap-3">
|
||||
<div class="flex flex-col gap-1 sm:flex-row sm:items-center sm:gap-3">
|
||||
<a class="underline text-sm text-sb-muted hover:text-white" href="{{ route('login') }}">Back to login</a>
|
||||
<a class="underline text-sm text-sb-muted hover:text-white" href="{{ route('register', ['email' => $email]) }}">Change email</a>
|
||||
</div>
|
||||
|
||||
<x-primary-button id="resend-btn" class="justify-center" type="submit">
|
||||
Resend verification email
|
||||
</x-primary-button>
|
||||
</div>
|
||||
|
||||
<p id="resend-timer" class="text-xs text-sb-muted"></p>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const form = document.getElementById('resend-form');
|
||||
const button = document.getElementById('resend-btn');
|
||||
const timerText = document.getElementById('resend-timer');
|
||||
|
||||
if (!form || !button || !timerText) return;
|
||||
|
||||
let remaining = parseInt(form.dataset.resendSeconds || '0', 10);
|
||||
|
||||
const render = () => {
|
||||
if (remaining > 0) {
|
||||
button.setAttribute('disabled', 'disabled');
|
||||
timerText.textContent = `You can resend in ${remaining}s.`;
|
||||
} else {
|
||||
button.removeAttribute('disabled');
|
||||
timerText.textContent = 'Did not receive it? You can resend now.';
|
||||
}
|
||||
};
|
||||
|
||||
render();
|
||||
if (remaining <= 0) return;
|
||||
|
||||
const interval = setInterval(() => {
|
||||
remaining -= 1;
|
||||
render();
|
||||
|
||||
if (remaining <= 0) {
|
||||
clearInterval(interval);
|
||||
}
|
||||
}, 1000);
|
||||
});
|
||||
</script>
|
||||
@endsection
|
||||
@@ -0,0 +1,67 @@
|
||||
@extends('layouts.nova')
|
||||
|
||||
@section('content')
|
||||
<div class="flex-1 flex items-center justify-center px-6 py-16 min-h-[calc(100vh-4rem)] box-border">
|
||||
<div class="max-w-5xl w-full">
|
||||
<div class="rounded-2xl border border-white/10 bg-slate-900/70 backdrop-blur shadow-xl p-8 auth-card">
|
||||
<h2 class="text-2xl font-semibold mb-2 text-white">Create Account</h2>
|
||||
|
||||
<p class="text-sm text-white/60 mb-6">Start with your email. You’ll choose a password and username after verification.</p>
|
||||
|
||||
@include('auth.partials.help-links', [
|
||||
'title' => 'Need help before you start?',
|
||||
'description' => 'Use the signup and login guide if you want a clearer view of verification, recovery, or what happens after the first account step.',
|
||||
])
|
||||
|
||||
@if($errors->has('oauth'))
|
||||
<div class="rounded-lg bg-red-900/40 border border-red-500/40 px-4 py-3 text-sm text-red-300 mb-4">
|
||||
{{ $errors->first('oauth') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if($errors->has('bot'))
|
||||
<div class="rounded-lg bg-red-900/40 border border-red-500/40 px-4 py-3 text-sm text-red-300 mb-4">
|
||||
{{ $errors->first('bot') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@include('auth.partials.social-login', ['dividerLabel' => 'or register with email'])
|
||||
<form method="POST" action="{{ route('register') }}" class="space-y-5" data-bot-form>
|
||||
@csrf
|
||||
<input type="text" name="homepage_url" value="" tabindex="-1" autocomplete="off" class="hidden" aria-hidden="true">
|
||||
<input type="hidden" name="_bot_fingerprint" value="">
|
||||
|
||||
@php
|
||||
$captchaProvider = $captcha['provider'] ?? 'turnstile';
|
||||
$captchaSiteKey = $captcha['siteKey'] ?? '';
|
||||
@endphp
|
||||
|
||||
<div>
|
||||
<label class="block text-sm mb-1 text-white/80" for="email">Email</label>
|
||||
<input id="email" name="email" type="email" required placeholder="you@example.com" value="{{ old('email', $prefillEmail ?? '') }}" class="w-full rounded-lg bg-slate-950/70 border border-white/10 px-4 py-3 text-sm focus:outline-none focus:ring-2 focus:ring-cyan-500 text-white" />
|
||||
<x-input-error :messages="$errors->get('email')" class="mt-2" />
|
||||
</div>
|
||||
|
||||
@if((($requiresCaptcha ?? false) || session('bot_captcha_required')) && $captchaSiteKey !== '')
|
||||
@if($captchaProvider === 'recaptcha')
|
||||
<div class="g-recaptcha" data-sitekey="{{ $captchaSiteKey }}" data-theme="dark"></div>
|
||||
@elseif($captchaProvider === 'hcaptcha')
|
||||
<div class="h-captcha" data-sitekey="{{ $captchaSiteKey }}" data-theme="dark"></div>
|
||||
@else
|
||||
<div class="cf-turnstile" data-sitekey="{{ $captchaSiteKey }}" data-theme="dark"></div>
|
||||
@endif
|
||||
<x-input-error :messages="$errors->get('captcha')" class="mt-2" />
|
||||
@endif
|
||||
|
||||
<button type="submit" class="w-full rounded-lg py-3 font-medium bg-gradient-to-r from-cyan-500 to-sky-400 hover:from-cyan-400 hover:to-sky-300 text-slate-900 transition">Continue</button>
|
||||
|
||||
<p class="text-sm text-center text-white/60">Already registered? <a href="{{ route('login') }}" class="text-cyan-400 hover:underline">Sign in</a></p>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@if((($requiresCaptcha ?? false) || session('bot_captcha_required')) && (($captcha['siteKey'] ?? '') !== '') && (($captcha['scriptUrl'] ?? '') !== ''))
|
||||
<script src="{{ $captcha['scriptUrl'] }}" async defer></script>
|
||||
@endif
|
||||
@include('partials.bot-fingerprint-script')
|
||||
@endsection
|
||||
@@ -0,0 +1,47 @@
|
||||
@extends('layouts.nova')
|
||||
|
||||
@section('content')
|
||||
<div class="flex-1 flex items-center justify-center px-6 py-16 min-h-[calc(100vh-4rem)] box-border">
|
||||
<div class="max-w-5xl w-full">
|
||||
<div class="rounded-2xl border border-white/10 bg-slate-900/70 backdrop-blur shadow-xl p-8 auth-card">
|
||||
<h2 class="text-2xl font-semibold mb-2 text-white">Reset Password</h2>
|
||||
<p class="text-sm text-white/60 mb-6">Choose a new password for your account.</p>
|
||||
|
||||
<form method="POST" action="{{ route('password.store') }}" class="mt-4">
|
||||
@csrf
|
||||
|
||||
<!-- Password Reset Token -->
|
||||
<input type="hidden" name="token" value="{{ $request->route('token') }}">
|
||||
|
||||
<!-- Email Address -->
|
||||
<div>
|
||||
<label class="block text-sm mb-1 text-white/80" for="email">Email</label>
|
||||
<x-text-input id="email" name="email" type="email" :value="old('email', $request->email)" required autofocus autocomplete="username" class="w-full rounded-lg bg-slate-950/70 border border-white/10 px-4 py-3 text-sm focus:outline-none focus:ring-2 focus:ring-cyan-500 text-white" />
|
||||
<x-input-error :messages="$errors->get('email')" class="mt-2" />
|
||||
</div>
|
||||
|
||||
<!-- Password -->
|
||||
<div class="mt-4">
|
||||
<label class="block text-sm mb-1 text-white/80" for="password">Password</label>
|
||||
<x-text-input id="password" name="password" type="password" required autocomplete="new-password" class="w-full rounded-lg bg-slate-950/70 border border-white/10 px-4 py-3 text-sm focus:outline-none focus:ring-2 focus:ring-cyan-500 text-white" />
|
||||
<x-input-error :messages="$errors->get('password')" class="mt-2" />
|
||||
</div>
|
||||
|
||||
<!-- Confirm Password -->
|
||||
<div class="mt-4">
|
||||
<x-input-label for="password_confirmation" :value="__('Confirm Password')" class="text-sb-muted" />
|
||||
|
||||
<x-text-input id="password_confirmation" name="password_confirmation" type="password" required autocomplete="new-password" class="w-full rounded-lg bg-slate-950/70 border border-white/10 px-4 py-3 text-sm focus:outline-none focus:ring-2 focus:ring-cyan-500 text-white" />
|
||||
|
||||
<x-input-error :messages="$errors->get('password_confirmation')" class="mt-2" />
|
||||
</div>
|
||||
|
||||
<div class="flex items-center justify-end mt-4">
|
||||
<x-primary-button>
|
||||
{{ __('Reset Password') }}
|
||||
</x-primary-button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
@@ -0,0 +1,43 @@
|
||||
@extends('layouts.nova')
|
||||
|
||||
@section('content')
|
||||
<div class="flex-1 flex items-center justify-center px-6 py-16 min-h-[calc(100vh-4rem)] box-border">
|
||||
<div class="max-w-5xl w-full">
|
||||
<div class="rounded-2xl border border-white/10 bg-slate-900/70 backdrop-blur shadow-xl p-8 auth-card">
|
||||
<h2 class="text-2xl font-semibold mb-2 text-white">Set Your Password</h2>
|
||||
<div class="mt-4 text-white/90">
|
||||
@include('auth.partials.onboarding-progress', ['currentStep' => 'verified'])
|
||||
|
||||
@if (session('status'))
|
||||
<div class="mb-4 rounded-md border border-green-700/60 bg-green-900/20 px-3 py-2 text-sm text-green-300">
|
||||
{{ session('status') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<p class="mb-4 text-sm text-white/60">{{ __('Create a password for ') }}<strong>{{ $email }}</strong></p>
|
||||
|
||||
<form method="POST" action="{{ route('setup.password.store') }}">
|
||||
@csrf
|
||||
|
||||
<div>
|
||||
<label class="block text-sm mb-1 text-white/80" for="password">Password</label>
|
||||
<x-text-input id="password" name="password" type="password" required autocomplete="new-password" class="w-full rounded-lg bg-slate-950/70 border border-white/10 px-4 py-3 text-sm focus:outline-none focus:ring-2 focus:ring-cyan-500 text-white" />
|
||||
<x-input-error :messages="$errors->get('password')" class="mt-2" />
|
||||
<p class="mt-2 text-xs text-sb-muted">{{ __('Minimum 10 characters, include at least one number and one symbol.') }}</p>
|
||||
</div>
|
||||
|
||||
<div class="mt-4">
|
||||
<label class="block text-sm mb-1 text-white/80" for="password_confirmation">Confirm Password</label>
|
||||
<x-text-input id="password_confirmation" name="password_confirmation" type="password" required autocomplete="new-password" class="w-full rounded-lg bg-slate-950/70 border border-white/10 px-4 py-3 text-sm focus:outline-none focus:ring-2 focus:ring-cyan-500 text-white" />
|
||||
</div>
|
||||
|
||||
<div class="mt-6 flex justify-end">
|
||||
<x-primary-button class="w-full sm:w-auto justify-center">
|
||||
{{ __('Continue') }}
|
||||
</x-primary-button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
@@ -0,0 +1,42 @@
|
||||
@extends('layouts.nova')
|
||||
|
||||
@section('content')
|
||||
<div class="flex-1 flex items-center justify-center px-6 py-16 min-h-[calc(100vh-4rem)] box-border">
|
||||
<div class="max-w-5xl w-full">
|
||||
<div class="rounded-2xl border border-white/10 bg-slate-900/70 backdrop-blur shadow-xl p-8 auth-card">
|
||||
<h2 class="text-2xl font-semibold mb-2 text-white">Choose Username</h2>
|
||||
<div class="mt-4 text-white/90">
|
||||
@include('auth.partials.onboarding-progress', ['currentStep' => 'password'])
|
||||
|
||||
@if (session('status'))
|
||||
<div class="mb-4 rounded-md border border-green-700/60 bg-green-900/20 px-3 py-2 text-sm text-green-300">
|
||||
{{ session('status') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if ($errors->any())
|
||||
<div class="mb-4 rounded-md border border-red-700/60 bg-red-900/20 px-3 py-2 text-sm text-red-300">
|
||||
{{ $errors->first() }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<form method="POST" action="{{ route('setup.username.store') }}">
|
||||
@csrf
|
||||
|
||||
<div>
|
||||
<label class="block text-sm mb-1 text-white/80" for="username">Username</label>
|
||||
<x-text-input id="username" name="username" type="text" :value="old('username', $username)" required autocomplete="username" data-username-field="true" data-availability-url="{{ route('api.username.availability') }}" data-availability-target="setup-username-availability" class="w-full rounded-lg bg-slate-950/70 border border-white/10 px-4 py-3 text-sm focus:outline-none focus:ring-2 focus:ring-cyan-500 text-white" />
|
||||
<p id="setup-username-availability" class="mt-1 text-xs text-sb-muted"></p>
|
||||
<x-input-error :messages="$errors->get('username')" class="mt-2" />
|
||||
</div>
|
||||
|
||||
<div class="mt-6 flex justify-end">
|
||||
<x-primary-button class="w-full sm:w-auto justify-center">
|
||||
{{ __('Complete Setup') }}
|
||||
</x-primary-button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
@@ -0,0 +1,37 @@
|
||||
@extends('layouts.nova')
|
||||
|
||||
@section('content')
|
||||
<div class="flex-1 flex items-center justify-center px-6 py-16 min-h-[calc(100vh-4rem)] box-border">
|
||||
<div class="max-w-5xl w-full">
|
||||
<div class="rounded-2xl border border-white/10 bg-slate-900/70 backdrop-blur shadow-xl p-8 auth-card">
|
||||
<h2 class="text-2xl font-semibold mb-2 text-white">Verify Your Email</h2>
|
||||
<p class="text-sm text-white/60 mb-6">Before getting started, please verify your email address by clicking the link we sent you.</p>
|
||||
|
||||
@if (session('status') == 'verification-link-sent')
|
||||
<div class="mb-4 rounded-md border border-green-700/60 bg-green-900/20 px-3 py-2 text-sm text-green-300">
|
||||
{{ __('A new verification link has been sent to the email address you provided during registration.') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="mt-4 flex items-center justify-between">
|
||||
<form method="POST" action="{{ route('verification.send') }}">
|
||||
@csrf
|
||||
|
||||
<div>
|
||||
<x-primary-button>
|
||||
{{ __('Resend Verification Email') }}
|
||||
</x-primary-button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<form method="POST" action="{{ route('logout') }}">
|
||||
@csrf
|
||||
|
||||
<button type="submit" class="underline text-sm text-sb-muted hover:text-white rounded-md">
|
||||
{{ __('Log Out') }}
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
Reference in New Issue
Block a user