From 7fd471386e556759fbd02ebbcbaddf5be7403c09 Mon Sep 17 00:00:00 2001 From: Curtis Delicata Date: Sat, 29 Jun 2024 17:37:50 +0000 Subject: [PATCH] Configure Jetstream classes in providers and separate panels into Admin and App --- app/Actions/Fortify/CreateNewUser.php | 41 +++----- .../Fortify/CreateNewUserWithTeams.php | 53 ++++++++++ .../Fortify/UpdateUserProfileInformation.php | 16 +-- app/Actions/Jetstream/AddTeamMember.php | 9 +- app/Actions/Jetstream/CreateTeam.php | 6 +- app/Actions/Jetstream/DeleteUserWithTeams.php | 44 +++++++++ app/Actions/Jetstream/InviteTeamMember.php | 6 +- app/Actions/Jetstream/RemoveTeamMember.php | 4 +- app/Actions/Jetstream/UpdateTeamName.php | 2 +- .../CreateUserWithTeamsFromProvider.php | 62 ++++++++++++ .../Controllers/ForgotPasswordController.php | 28 ++++++ app/Http/Controllers/LoginController.php | 41 ++++++++ .../Controllers/ResetPasswordController.php | 44 +++++++++ .../Controllers/TeamInvitationController.php | 49 ++++++++++ app/Listeners/CreatePersonalTeam.php | 20 +--- app/Listeners/SwitchTeam.php | 13 +-- .../views/auth/confirm-password.blade.php | 28 ++++++ .../views/auth/forgot-password.blade.php | 34 +++++++ resources/views/auth/login.blade.php | 94 ++++++++---------- resources/views/auth/register.blade.php | 97 ++++++++----------- resources/views/auth/reset-password.blade.php | 36 +++++++ .../views/auth/two-factor-challenge.blade.php | 58 +++++++++++ resources/views/auth/verify-email.blade.php | 45 +++++++++ resources/views/components/button.blade.php | 2 +- resources/views/components/buttons.blade.php | 10 ++ resources/views/components/checkbox.blade.php | 2 +- .../views/components/contact-form.blade.php | 27 ++++++ resources/views/components/footer.blade.php | 20 ++++ resources/views/components/header.blade.php | 27 ++++++ .../views/components/home-header.blade.php | 25 +++++ .../views/components/home-navbar.blade.php | 78 +++++++++++++++ resources/views/components/input.blade.php | 2 +- .../views/components/manage_section.blade.php | 24 +++++ .../components/products_section.blade.php | 18 ++++ .../components/secondary-button.blade.php | 2 +- .../components/validation-errors.blade.php | 3 +- resources/views/components/welcome.blade.php | 32 +++--- .../views/components/why_us_section.blade.php | 17 ++++ 38 files changed, 912 insertions(+), 207 deletions(-) create mode 100644 app/Actions/Fortify/CreateNewUserWithTeams.php create mode 100644 app/Actions/Jetstream/DeleteUserWithTeams.php create mode 100644 app/Actions/Socialstream/CreateUserWithTeamsFromProvider.php create mode 100644 app/Http/Controllers/ForgotPasswordController.php create mode 100644 app/Http/Controllers/LoginController.php create mode 100644 app/Http/Controllers/ResetPasswordController.php create mode 100644 app/Http/Controllers/TeamInvitationController.php create mode 100644 resources/views/auth/confirm-password.blade.php create mode 100644 resources/views/auth/forgot-password.blade.php create mode 100644 resources/views/auth/reset-password.blade.php create mode 100644 resources/views/auth/two-factor-challenge.blade.php create mode 100644 resources/views/auth/verify-email.blade.php create mode 100644 resources/views/components/buttons.blade.php create mode 100644 resources/views/components/contact-form.blade.php create mode 100644 resources/views/components/footer.blade.php create mode 100644 resources/views/components/header.blade.php create mode 100644 resources/views/components/home-header.blade.php create mode 100644 resources/views/components/home-navbar.blade.php create mode 100644 resources/views/components/manage_section.blade.php create mode 100644 resources/views/components/products_section.blade.php create mode 100644 resources/views/components/why_us_section.blade.php diff --git a/app/Actions/Fortify/CreateNewUser.php b/app/Actions/Fortify/CreateNewUser.php index bb4bbe28..7bf18d0a 100644 --- a/app/Actions/Fortify/CreateNewUser.php +++ b/app/Actions/Fortify/CreateNewUser.php @@ -2,20 +2,18 @@ namespace App\Actions\Fortify; -use App\Models\Team; use App\Models\User; -use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Validator; +use Illuminate\Validation\Rule; use Laravel\Fortify\Contracts\CreatesNewUsers; -use Laravel\Jetstream\Jetstream; class CreateNewUser implements CreatesNewUsers { use PasswordValidationRules; /** - * Create a newly registered user. + * Validate and create a newly registered user. * * @param array $input */ @@ -23,31 +21,20 @@ public function create(array $input): User { Validator::make($input, [ 'name' => ['required', 'string', 'max:255'], - 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], + 'email' => [ + 'required', + 'string', + 'email', + 'max:255', + Rule::unique(User::class), + ], 'password' => $this->passwordRules(), - 'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature() ? ['accepted', 'required'] : '', ])->validate(); - return DB::transaction(function () use ($input) { - return tap(User::create([ - 'name' => $input['name'], - 'email' => $input['email'], - 'password' => Hash::make($input['password']), - ]), function (User $user) { - $this->createTeam($user); - }); - }); - } - - /** - * Create a personal team for the user. - */ - protected function createTeam(User $user): void - { - $user->ownedTeams()->save(Team::forceCreate([ - 'user_id' => $user->id, - 'name' => explode(' ', $user->name, 2)[0]."'s Team", - 'personal_team' => true, - ])); + return User::create([ + 'name' => $input['name'], + 'email' => $input['email'], + 'password' => Hash::make($input['password']), + ]); } } diff --git a/app/Actions/Fortify/CreateNewUserWithTeams.php b/app/Actions/Fortify/CreateNewUserWithTeams.php new file mode 100644 index 00000000..9788471d --- /dev/null +++ b/app/Actions/Fortify/CreateNewUserWithTeams.php @@ -0,0 +1,53 @@ + $input + */ + public function create(array $input): User + { + Validator::make($input, [ + 'name' => ['required', 'string', 'max:255'], + 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], + 'password' => $this->passwordRules(), + 'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature() ? ['accepted', 'required'] : '', + ])->validate(); + + return DB::transaction(function () use ($input) { + return tap(User::create([ + 'name' => $input['name'], + 'email' => $input['email'], + 'password' => Hash::make($input['password']), + ]), function (User $user) { + $this->createTeam($user); + }); + }); + } + + /** + * Create a personal team for the user. + */ + protected function createTeam(User $user): void + { + $user->ownedTeams()->save(Team::forceCreate([ + 'user_id' => $user->id, + 'name' => explode(' ', $user->name, 2)[0]."'s Team", + 'personal_team' => true, + ])); + } +} diff --git a/app/Actions/Fortify/UpdateUserProfileInformation.php b/app/Actions/Fortify/UpdateUserProfileInformation.php index 9738772d..0930ddf3 100644 --- a/app/Actions/Fortify/UpdateUserProfileInformation.php +++ b/app/Actions/Fortify/UpdateUserProfileInformation.php @@ -13,19 +13,21 @@ class UpdateUserProfileInformation implements UpdatesUserProfileInformation /** * Validate and update the given user's profile information. * - * @param array $input + * @param array $input */ public function update(User $user, array $input): void { Validator::make($input, [ 'name' => ['required', 'string', 'max:255'], - 'email' => ['required', 'email', 'max:255', Rule::unique('users')->ignore($user->id)], - 'photo' => ['nullable', 'mimes:jpg,jpeg,png', 'max:1024'], - ])->validateWithBag('updateProfileInformation'); - if (isset($input['photo'])) { - $user->updateProfilePhoto($input['photo']); - } + 'email' => [ + 'required', + 'string', + 'email', + 'max:255', + Rule::unique('users')->ignore($user->id), + ], + ])->validateWithBag('updateProfileInformation'); if ($input['email'] !== $user->email && $user instanceof MustVerifyEmail) { diff --git a/app/Actions/Jetstream/AddTeamMember.php b/app/Actions/Jetstream/AddTeamMember.php index cf3ae4bd..c3d91bc0 100644 --- a/app/Actions/Jetstream/AddTeamMember.php +++ b/app/Actions/Jetstream/AddTeamMember.php @@ -29,7 +29,8 @@ public function add(User $user, Team $team, string $email, string $role = null): AddingTeamMember::dispatch($team, $newTeamMember); $team->users()->attach( - $newTeamMember, ['role' => $role] + $newTeamMember, + ['role' => $role] ); TeamMemberAdded::dispatch($team, $newTeamMember); @@ -42,7 +43,7 @@ protected function validate(Team $team, string $email, ?string $role): void { Validator::make([ 'email' => $email, - 'role' => $role, + 'role' => $role, ], $this->rules(), [ 'email.exists' => __('We were unable to find a registered user with this email address.'), ])->after( @@ -59,8 +60,8 @@ protected function rules(): array { return array_filter([ 'email' => ['required', 'email', 'exists:users'], - 'role' => Jetstream::hasRoles() - ? ['required', 'string', new Role] + 'role' => Jetstream::hasRoles() + ? ['required', 'string', new Role()] : null, ]); } diff --git a/app/Actions/Jetstream/CreateTeam.php b/app/Actions/Jetstream/CreateTeam.php index 7ace5d95..6e6020c1 100644 --- a/app/Actions/Jetstream/CreateTeam.php +++ b/app/Actions/Jetstream/CreateTeam.php @@ -15,7 +15,7 @@ class CreateTeam implements CreatesTeams /** * Validate and create a new team for the given user. * - * @param array $input + * @param array $input */ public function create(User $user, array $input): Team { @@ -28,8 +28,8 @@ public function create(User $user, array $input): Team AddingTeam::dispatch($user); $user->switchTeam($team = $user->ownedTeams()->create([ - 'name' => $input['name'], - 'personal_team' => false, + 'name' => $input['name'], + 'personal_team' => true, ])); return $team; diff --git a/app/Actions/Jetstream/DeleteUserWithTeams.php b/app/Actions/Jetstream/DeleteUserWithTeams.php new file mode 100644 index 00000000..4b051af4 --- /dev/null +++ b/app/Actions/Jetstream/DeleteUserWithTeams.php @@ -0,0 +1,44 @@ +deleteTeams($user); + $user->deleteProfilePhoto(); + $user->tokens->each->delete(); + $user->delete(); + }); + } + + /** + * Delete the teams and team associations attached to the user. + */ + protected function deleteTeams(User $user): void + { + $user->teams()->detach(); + + $user->ownedTeams->each(function (Team $team) { + $this->deletesTeams->delete($team); + }); + } +} diff --git a/app/Actions/Jetstream/InviteTeamMember.php b/app/Actions/Jetstream/InviteTeamMember.php index 641360f5..4d74abe8 100644 --- a/app/Actions/Jetstream/InviteTeamMember.php +++ b/app/Actions/Jetstream/InviteTeamMember.php @@ -31,7 +31,7 @@ public function invite(User $user, Team $team, string $email, string $role = nul $invitation = $team->teamInvitations()->create([ 'email' => $email, - 'role' => $role, + 'role' => $role, ]); Mail::to($email)->send(new TeamInvitation($invitation)); @@ -44,7 +44,7 @@ protected function validate(Team $team, string $email, ?string $role): void { Validator::make([ 'email' => $email, - 'role' => $role, + 'role' => $role, ], $this->rules($team), [ 'email.unique' => __('This user has already been invited to the team.'), ])->after( @@ -67,7 +67,7 @@ protected function rules(Team $team): array }), ], 'role' => Jetstream::hasRoles() - ? ['required', 'string', new Role] + ? ['required', 'string', new Role()] : null, ]); } diff --git a/app/Actions/Jetstream/RemoveTeamMember.php b/app/Actions/Jetstream/RemoveTeamMember.php index ddf755ed..2b354ef0 100644 --- a/app/Actions/Jetstream/RemoveTeamMember.php +++ b/app/Actions/Jetstream/RemoveTeamMember.php @@ -31,9 +31,9 @@ public function remove(User $user, Team $team, User $teamMember): void */ protected function authorize(User $user, Team $team, User $teamMember): void { - if (! Gate::forUser($user)->check('removeTeamMember', $team) && + if (!Gate::forUser($user)->check('removeTeamMember', $team) && $user->id !== $teamMember->id) { - throw new AuthorizationException; + throw new AuthorizationException(); } } diff --git a/app/Actions/Jetstream/UpdateTeamName.php b/app/Actions/Jetstream/UpdateTeamName.php index b4e28d9e..e0dadb8f 100644 --- a/app/Actions/Jetstream/UpdateTeamName.php +++ b/app/Actions/Jetstream/UpdateTeamName.php @@ -13,7 +13,7 @@ class UpdateTeamName implements UpdatesTeamNames /** * Validate and update the given team's name. * - * @param array $input + * @param array $input */ public function update(User $user, Team $team, array $input): void { diff --git a/app/Actions/Socialstream/CreateUserWithTeamsFromProvider.php b/app/Actions/Socialstream/CreateUserWithTeamsFromProvider.php new file mode 100644 index 00000000..0dc5b9e7 --- /dev/null +++ b/app/Actions/Socialstream/CreateUserWithTeamsFromProvider.php @@ -0,0 +1,62 @@ +createsConnectedAccounts = $createsConnectedAccounts; + } + + /** + * Create a new user from a social provider user. + */ + public function create(string $provider, ProviderUserContract $providerUser): User + { + return DB::transaction(function () use ($provider, $providerUser) { + return tap(User::create([ + 'name' => $providerUser->getName(), + 'email' => $providerUser->getEmail(), + ]), function (User $user) use ($provider, $providerUser) { + $user->markEmailAsVerified(); + + if (Socialstream::hasProviderAvatarsFeature() && $providerUser->getAvatar()) { + $user->setProfilePhotoFromUrl($providerUser->getAvatar()); + } + + $this->createsConnectedAccounts->create($user, $provider, $providerUser); + + $this->createTeam($user); + }); + }); + } + + /** + * Create a personal team for the user. + */ + protected function createTeam(User $user): void + { + $user->ownedTeams()->save(Team::forceCreate([ + 'user_id' => $user->id, + 'name' => explode(' ', $user->name, 2)[0]."'s Team", + 'personal_team' => true, + ])); + } +} diff --git a/app/Http/Controllers/ForgotPasswordController.php b/app/Http/Controllers/ForgotPasswordController.php new file mode 100644 index 00000000..4517a24c --- /dev/null +++ b/app/Http/Controllers/ForgotPasswordController.php @@ -0,0 +1,28 @@ +validate(['email' => 'required|email']); + + $status = Password::broker('admins')->sendResetLink( + $request->only('email') + ); + + return $status === Password::RESET_LINK_SENT + ? back()->with(['status' => __($status)]) + : back()->withErrors(['email' => __($status)]); + } +} diff --git a/app/Http/Controllers/LoginController.php b/app/Http/Controllers/LoginController.php new file mode 100644 index 00000000..3cfdaa5a --- /dev/null +++ b/app/Http/Controllers/LoginController.php @@ -0,0 +1,41 @@ +validate([ + 'email' => ['required', 'email'], + 'password' => ['required'], + ]); + + if (Auth::guard('admin')->attempt($credentials)) { + $request->session()->regenerate(); + + return redirect()->intended('/admin'); + } + + return back()->withErrors([ + 'email' => 'The provided credentials do not match our records.', + ]); + } + + public function logout(Request $request) + { + Auth::guard('admin')->logout(); + $request->session()->invalidate(); + $request->session()->regenerateToken(); + + return redirect('/admin/login'); + } +} diff --git a/app/Http/Controllers/ResetPasswordController.php b/app/Http/Controllers/ResetPasswordController.php new file mode 100644 index 00000000..6919be2e --- /dev/null +++ b/app/Http/Controllers/ResetPasswordController.php @@ -0,0 +1,44 @@ + $token, 'email' => $request->email]); + } + + public function reset(Request $request) + { + $request->validate([ + 'token' => 'required', + 'email' => 'required|email', + 'password' => 'required|min:8|confirmed', + ]); + + $status = Password::broker('admins')->reset( + $request->only('email', 'password', 'password_confirmation', 'token'), + function ($user, $password) { + $user->forceFill([ + 'password' => Hash::make($password), + ])->setRememberToken(Str::random(60)); + + $user->save(); + + event(new PasswordReset($user)); + } + ); + + return $status === Password::PASSWORD_RESET + ? redirect()->route('admin.login')->with('status', __($status)) + : back()->withErrors(['email' => [__($status)]]); + } +} diff --git a/app/Http/Controllers/TeamInvitationController.php b/app/Http/Controllers/TeamInvitationController.php new file mode 100644 index 00000000..d445b7c1 --- /dev/null +++ b/app/Http/Controllers/TeamInvitationController.php @@ -0,0 +1,49 @@ +validate([ + 'email' => 'required|email', + 'team_id' => 'required|exists:teams,id', + ]); + + $user = User::firstOrCreate(['email' => $request->email], ['password' => bcrypt(Str::random(10))]); + $team = Team::findOrFail($request->team_id); + + $invitationToken = Str::random(32); + $user->invitations()->create([ + 'team_id' => $team->id, + 'token' => $invitationToken, + ]); + + Mail::to($request->email)->send(new TeamInvitation($user, $team, $invitationToken)); + + return response()->json(['message' => 'Invitation sent successfully.']); + } + + public function acceptInvitation(Request $request) + { + $request->validate([ + 'token' => 'required|exists:invitations,token', + ]); + + $invitation = Invitation::where('token', $request->token)->firstOrFail(); + $team = Team::findOrFail($invitation->team_id); + $team->members()->attach($invitation->user_id); + + $invitation->update(['accepted' => true]); + + return response()->json(['message' => 'Invitation accepted successfully.']); + } +} diff --git a/app/Listeners/CreatePersonalTeam.php b/app/Listeners/CreatePersonalTeam.php index 2d40b25b..c2e36e3b 100644 --- a/app/Listeners/CreatePersonalTeam.php +++ b/app/Listeners/CreatePersonalTeam.php @@ -2,10 +2,6 @@ namespace App\Listeners; -use App\Models\Team; -use Filament\Events\Auth\Registered; -use Laravel\Jetstream\Features; - class CreatePersonalTeam { /** @@ -19,20 +15,8 @@ public function __construct() /** * Handle the event. */ - public function handle(Registered $event): void + public function handle(object $event): void { - $user = $event->getUser(); - - if (Features::hasTeamFeatures()) { - $team = Team::forceCreate([ - 'user_id' => $user->id, - 'name' => explode(' ', $user->name, 2)[0] . "'s Team", - 'personal_team' => true, - ]); - - $user->ownedTeams()->save($team); - - $user->switchTeam($team); - } + // } } diff --git a/app/Listeners/SwitchTeam.php b/app/Listeners/SwitchTeam.php index 82f29d56..d82205a8 100644 --- a/app/Listeners/SwitchTeam.php +++ b/app/Listeners/SwitchTeam.php @@ -2,9 +2,6 @@ namespace App\Listeners; -use Filament\Events\TenantSet; -use Laravel\Jetstream\Features; - class SwitchTeam { /** @@ -18,14 +15,8 @@ public function __construct() /** * Handle the event. */ - public function handle(TenantSet $event): void + public function handle(object $event): void { - if (Features::hasTeamFeatures()) { - $user = $event->getUser(); - - $team = $event->getTenant(); - - $user->switchTeam($team); - } + // dd($event); } } diff --git a/resources/views/auth/confirm-password.blade.php b/resources/views/auth/confirm-password.blade.php new file mode 100644 index 00000000..0a109b80 --- /dev/null +++ b/resources/views/auth/confirm-password.blade.php @@ -0,0 +1,28 @@ + + + + + + +
+ {{ __('This is a secure area of the application. Please confirm your password before continuing.') }} +
+ + + +
+ @csrf + +
+ + +
+ +
+ + {{ __('Confirm') }} + +
+
+
+
diff --git a/resources/views/auth/forgot-password.blade.php b/resources/views/auth/forgot-password.blade.php new file mode 100644 index 00000000..15235f4f --- /dev/null +++ b/resources/views/auth/forgot-password.blade.php @@ -0,0 +1,34 @@ + + + + + + +
+ {{ __('Forgot your password? No problem. Just let us know your email address and we will email you a password reset link that will allow you to choose a new one.') }} +
+ + @session('status') +
+ {{ $value }} +
+ @endsession + + + +
+ @csrf + +
+ + +
+ +
+ + {{ __('Email Password Reset Link') }} + +
+
+
+
diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index 8689ce2c..8866b117 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -1,52 +1,42 @@ - - - - - - - - - @if (session('status')) -
- {{ session('status') }} -
- @endif - -
- @csrf - -
- - -
- -
- - -
- -
- -
- -
- @if (Route::has('password.request')) - - {{ __('Forgot your password?') }} - - @endif - - - {{ __('Login') }} - -
-
- - @if (JoelButcher\Socialstream\Socialstream::show()) - - @endif -
-
+@extends('layouts.home') + +@section('content') +
+
+
+ {{ __('Please sign in to access the admin panel.') }} +
+ +
+ @csrf + +
+ + +
+ +
+ + +
+ +
+ +
+ +
+ +
+
+
+
+@endsection diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php index 526eeff7..c3a252a8 100644 --- a/resources/views/auth/register.blade.php +++ b/resources/views/auth/register.blade.php @@ -1,64 +1,47 @@ - - - - - - - - -
- @csrf - -
- - -
- -
- - -
- -
- - -
- -
- - -
+@extends('layouts.home') + +@section('content') +
+
+ + + +
+ +
+ + @csrf + +
+ + +
- @if (Laravel\Jetstream\Jetstream::hasTermsAndPrivacyPolicyFeature())
- -
- + + +
-
- {!! __('I agree to the :terms_of_service and :privacy_policy', [ - 'terms_of_service' => ''.__('Terms of Service').'', - 'privacy_policy' => ''.__('Privacy Policy').'', - ]) !!} -
-
- +
+ +
- @endif -
- - {{ __('Already registered?') }} - +
+ + +
- - {{ __('Register') }} - -
- +
+ + {{ __('Already registered?') }} + - @if (JoelButcher\Socialstream\Socialstream::show()) - - @endif - - + + {{ __('Register') }} + +
+ +
+
+@endsection diff --git a/resources/views/auth/reset-password.blade.php b/resources/views/auth/reset-password.blade.php new file mode 100644 index 00000000..5991e3ef --- /dev/null +++ b/resources/views/auth/reset-password.blade.php @@ -0,0 +1,36 @@ + + + + + + + + +
+ @csrf + + + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + {{ __('Reset Password') }} + +
+
+
+
diff --git a/resources/views/auth/two-factor-challenge.blade.php b/resources/views/auth/two-factor-challenge.blade.php new file mode 100644 index 00000000..57e0347d --- /dev/null +++ b/resources/views/auth/two-factor-challenge.blade.php @@ -0,0 +1,58 @@ + + + + + + +
+
+ {{ __('Please confirm access to your account by entering the authentication code provided by your authenticator application.') }} +
+ +
+ {{ __('Please confirm access to your account by entering one of your emergency recovery codes.') }} +
+ + + +
+ @csrf + +
+ + +
+ +
+ + +
+ +
+ + + + + + {{ __('Log in') }} + +
+
+
+
+
diff --git a/resources/views/auth/verify-email.blade.php b/resources/views/auth/verify-email.blade.php new file mode 100644 index 00000000..05728536 --- /dev/null +++ b/resources/views/auth/verify-email.blade.php @@ -0,0 +1,45 @@ + + + + + + +
+ {{ __('Before continuing, could you verify your email address by clicking on the link we just emailed to you? If you didn\'t receive the email, we will gladly send you another.') }} +
+ + @if (session('status') == 'verification-link-sent') +
+ {{ __('A new verification link has been sent to the email address you provided in your profile settings.') }} +
+ @endif + +
+
+ @csrf + +
+ + {{ __('Resend Verification Email') }} + +
+
+ +
+ + {{ __('Edit Profile') }} + +
+ @csrf + + +
+
+
+
+
diff --git a/resources/views/components/button.blade.php b/resources/views/components/button.blade.php index 2995b58d..232734ca 100644 --- a/resources/views/components/button.blade.php +++ b/resources/views/components/button.blade.php @@ -1,3 +1,3 @@ - diff --git a/resources/views/components/buttons.blade.php b/resources/views/components/buttons.blade.php new file mode 100644 index 00000000..ce6babc5 --- /dev/null +++ b/resources/views/components/buttons.blade.php @@ -0,0 +1,10 @@ +
+
+ + + diff --git a/resources/views/components/footer.blade.php b/resources/views/components/footer.blade.php new file mode 100644 index 00000000..3a73e814 --- /dev/null +++ b/resources/views/components/footer.blade.php @@ -0,0 +1,20 @@ + diff --git a/resources/views/components/header.blade.php b/resources/views/components/header.blade.php new file mode 100644 index 00000000..6a79b8df --- /dev/null +++ b/resources/views/components/header.blade.php @@ -0,0 +1,27 @@ +
+ +
+@include('components.buttons') +@include('components.buttons') diff --git a/resources/views/components/home-header.blade.php b/resources/views/components/home-header.blade.php new file mode 100644 index 00000000..4ae64817 --- /dev/null +++ b/resources/views/components/home-header.blade.php @@ -0,0 +1,25 @@ +
+ +
diff --git a/resources/views/components/home-navbar.blade.php b/resources/views/components/home-navbar.blade.php new file mode 100644 index 00000000..674d1c36 --- /dev/null +++ b/resources/views/components/home-navbar.blade.php @@ -0,0 +1,78 @@ + + + + + diff --git a/resources/views/components/input.blade.php b/resources/views/components/input.blade.php index ac620dd0..18c4b315 100644 --- a/resources/views/components/input.blade.php +++ b/resources/views/components/input.blade.php @@ -1,3 +1,3 @@ @props(['disabled' => false]) -merge(['class' => 'border-gray-300 focus:border-gray-500 focus:ring-gray-500 rounded-md shadow-sm']) !!}> +merge(['class' => 'border-gray-300 focus:border-indigo-500 text-gray-700 focus:ring-indigo-500 rounded-md shadow-sm']) !!}> diff --git a/resources/views/components/manage_section.blade.php b/resources/views/components/manage_section.blade.php new file mode 100644 index 00000000..f2f7f34f --- /dev/null +++ b/resources/views/components/manage_section.blade.php @@ -0,0 +1,24 @@ +
+

Manage Your Genealogy

+

Explore and manage your family tree with ease.

+
+
+
+
Family Tree
+

View and edit your family tree.

+
+
+
+
+
Records
+

Access and manage historical records.

+
+
+
+
+
Settings
+

Configure your account and preferences.

+
+
+
+
diff --git a/resources/views/components/products_section.blade.php b/resources/views/components/products_section.blade.php new file mode 100644 index 00000000..9bc9d3f7 --- /dev/null +++ b/resources/views/components/products_section.blade.php @@ -0,0 +1,18 @@ +
+
+

Our Products

+

Discover our range of genealogy tools designed to help you explore your ancestry.

+
+ @foreach($products as $product) +
+ {{ $product->name }} +
+

{{ $product->name }}

+

{{ $product->description }}

+ +
+
+ @endforeach +
+
+
diff --git a/resources/views/components/secondary-button.blade.php b/resources/views/components/secondary-button.blade.php index 5bc979b9..b32b69fc 100644 --- a/resources/views/components/secondary-button.blade.php +++ b/resources/views/components/secondary-button.blade.php @@ -1,3 +1,3 @@ - diff --git a/resources/views/components/validation-errors.blade.php b/resources/views/components/validation-errors.blade.php index a62b46e9..ef753f5d 100644 --- a/resources/views/components/validation-errors.blade.php +++ b/resources/views/components/validation-errors.blade.php @@ -1,5 +1,4 @@ -@if ($errors->has('socialstream')) -@elseif ($errors->any()) +@if ($errors->any())
{{ __('Whoops! Something went wrong.') }}
diff --git a/resources/views/components/welcome.blade.php b/resources/views/components/welcome.blade.php index c588c76b..298e56eb 100644 --- a/resources/views/components/welcome.blade.php +++ b/resources/views/components/welcome.blade.php @@ -1,11 +1,11 @@ -
+
-

+

Welcome to your Jetstream application!

-

+

Laravel Jetstream provides a beautiful, robust starting point for your next Laravel application. Laravel is designed to help you build your application using a development environment that is simple, powerful, and enjoyable. We believe you should love expressing your creativity through programming, so we have spent time carefully crafting the Laravel @@ -13,26 +13,26 @@

-
+
-

+

Laravel has wonderful documentation covering every aspect of the framework. Whether you're new to the framework or have previous experience, we recommend reading all of the documentation from beginning to end.

- + Explore the documentation - + @@ -44,20 +44,20 @@ -

+

Laracasts

-

+

Laracasts offers thousands of video tutorials on Laravel, PHP, and JavaScript development. Check them out, see for yourself, and massively level up your development skills in the process.

- + Start watching Laracasts - + @@ -69,12 +69,12 @@ -

+

Tailwind

-

+

Laravel Jetstream is built with Tailwind, an amazing utility first CSS framework that doesn't get in your way. You'll be amazed how easily you can build and maintain fresh, modern designs with this wonderful framework at your fingertips.

@@ -84,12 +84,12 @@ -

+

Authentication

-

+

Authentication and registration views are included with Laravel Jetstream, as well as support for user email verification and resetting forgotten passwords. So, you're free to get started with what matters most: building your application.

diff --git a/resources/views/components/why_us_section.blade.php b/resources/views/components/why_us_section.blade.php new file mode 100644 index 00000000..82d3001e --- /dev/null +++ b/resources/views/components/why_us_section.blade.php @@ -0,0 +1,17 @@ +
+
+

{{ $title }}

+

{{ $description }}

+
+ @foreach($features as $feature) +
+ {{ $feature['title'] }} +
+

{{ $feature['title'] }}

+

{{ $feature['description'] }}

+
+
+ @endforeach +
+
+