Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
124 commits
Select commit Hold shift + click to select a range
a91ba17
port skeleton change
taylorotwell Mar 4, 2025
854097b
AppLogo class fixed (#72)
msh1596 Mar 4, 2025
b18bb6f
fix route redirect for settings path (#70)
Maarten-Dekker Mar 4, 2025
41eb194
Add `ziggy.js` to `.prettierignore` (#68)
lokomilo Mar 4, 2025
f4c0a41
Bye bye separator 👋🏻 (#66)
joelbutcher Mar 4, 2025
87c5988
fixing the margin of the layout when the sidebar is collapsed (#75)
tnylea Mar 4, 2025
8370090
remove comment
taylorotwell Mar 4, 2025
c4b9cf5
Fixing Inertia SSR errors (#74)
tnylea Mar 6, 2025
6602f0e
Add a `.prettierignore` rule to exclude `resources/views/mail/*` from…
michaelnabil230 Mar 7, 2025
bb6a736
Replcae package with built-in (#76)
laserhybiz Mar 12, 2025
6fa726e
fix: sidebar dropdown open position (#71)
pristavu Mar 12, 2025
8bb3ffd
[12.x] Structural improvement (#86)
AhmedAlaa4611 Mar 19, 2025
f911c5e
Adding tooltips to collapsible sidebar (#85)
tnylea Mar 19, 2025
5ae6361
fix: change type of route() to Router (#83)
D4ve-R Mar 19, 2025
bac572c
removing pest test for the new installer (#84)
tnylea Apr 1, 2025
0e9664e
Use shadcn built-in check for sidebar state (#82)
JoeyMckenzie Apr 1, 2025
56b3d93
Migrate to reka-ui (#55)
laserhybiz Apr 1, 2025
ffcca06
formatting
taylorotwell Apr 9, 2025
0a17da2
Tailwind V4 Upgrade 💾 (#93)
tnylea Apr 9, 2025
a994387
Add `composer run test` command (#103)
crynobone Apr 11, 2025
28925e1
Adding prefetch to settings and adding logout flush (#116)
tnylea Apr 22, 2025
f8fbc99
Update AppSidebarHeader.vue: add empty array for breadcrumbs as defa…
drsoft28 Apr 22, 2025
680ecbc
Sidebar state fix (#106)
firebed Apr 22, 2025
1d148b7
Revert "Sidebar state fix (#106)" (#118)
taylorotwell Apr 22, 2025
826412b
remove unused package (#101)
laserhybiz Apr 22, 2025
3c817d3
Remove unnecessary prop (#102)
laserhybiz Apr 22, 2025
e8ef618
fix: tabindex on login form (#104)
ace-of-aces Apr 22, 2025
47f92bb
code: remove unused props (#96)
fabpl Apr 22, 2025
55cc169
fix: improve usability and ensure type safety (#97)
firebed Apr 22, 2025
dc5bb6d
Adding updates to vue starter kit favicons (#130)
tnylea Apr 29, 2025
833b544
remove unused lib (#128)
ibrunotome Apr 29, 2025
cf71ce6
Update README to reflect migration to Reka UI (#119)
gul-ahmad Apr 29, 2025
6918571
Revert "Update README to reflect migration to Reka UI (#119)" (#132)
taylorotwell Apr 29, 2025
e09dac8
Adding the red favicon back via design req (#133)
tnylea Apr 30, 2025
30219c5
Update SIDEBAR_COOKIE_NAME (#131)
firebed Apr 30, 2025
9b8dd88
Adding vue page component to vite helper (#135)
tnylea May 2, 2025
06fe48e
Making sure all related processed are closed when terminating the con…
Ciaro Jun 5, 2025
b61b96b
fix: handly conflicting variable with same name (#146)
pushpak1300 Jun 5, 2025
27b6441
Remove redundant `@layer base` from app.css (#144)
ronaldtveen Jun 5, 2025
50c1af7
fixing logo line height (#141)
tnylea Jun 5, 2025
5984c70
Update app.ts (#140)
bishwajitcadhikary Jun 5, 2025
1e43125
Remove nested submit button (#138)
firebed Jun 5, 2025
677fbbc
ui: fix AppHeader menu item (#137)
fabpl Jun 5, 2025
431ba93
Move appearance ref definition outside useAppearance() (#129)
nckrtl Jun 5, 2025
a5671b9
Adding the intertia config to use lowercase pages (#108)
tnylea Jun 5, 2025
4c7d0e3
fixing the margin of the layout when the sidebar is collapsed (#143)
misterneo Jun 5, 2025
eac2f4c
prettier
taylorotwell Jun 5, 2025
34d788d
fixes prettier
taylorotwell Jun 5, 2025
c17ef70
Fix various TypeScript issues, simplify ziggy-js integration and shar…
TimKunze96 Jun 5, 2025
09ee1a9
update package lock
taylorotwell Jun 5, 2025
2a32eb3
Simplify vite.config.ts by removing the "duplicate" @ alias (#156)
nckrtl Jul 4, 2025
da476db
fix: augment 'vue' instead of '@vue/runtime-core' (#154)
mrleblanc101 Jul 4, 2025
9f84d89
Update app.css - add missing `hsl()` (#153)
Plytas Jul 4, 2025
10306ec
fix: Set overflow-x-auto in Dashboard.vue and overflow-x-hidden in Ap…
filipprober Jul 4, 2025
2f6fe6b
chore: make consistent breadcrumbItems variable name (#150)
MrMohamedAbdallah Jul 4, 2025
fbae2a4
Fix title helper to fallback to app name when no title is provided (#…
bishwajitcadhikary Jul 4, 2025
ca6ad3a
Use `fulfill` in the `EmailVerificationRequest` (#160)
michaelnabil230 Jul 24, 2025
580dbd1
Use `tsx` flag instead of `typescript` (#166)
gainlinejono Jul 24, 2025
b9792f7
Use `vue/server-renderer` instead of `@vue/server-renderer` for SSR (…
sistracia Jul 24, 2025
c3759d7
Add throttle to authed password routes (#159)
valorin Jul 24, 2025
381c0d2
Update Settings Layout- Remove y spacing and update break for Separat…
cwray-tech Jul 24, 2025
2d6a493
fix: add cva in tailwindFunctions for prettier class sorting (#164)
mrleblanc101 Jul 24, 2025
45a152e
Upgrade Vite to v7 (#163)
ChristianJoniel Jul 24, 2025
9b2e1e0
update lock
taylorotwell Jul 24, 2025
843c633
add method to forms
taylorotwell Aug 11, 2025
24332ac
upgrade to inertia ^2.1.0
joetannenbaum Aug 13, 2025
e6cd4de
Remove TSX from components.json (#170)
gainlinejono Aug 14, 2025
9262b1f
Update package-lock.json
joetannenbaum Aug 14, 2025
5665712
useForm -> form component
joetannenbaum Aug 14, 2025
bdd059d
Update package-lock.json
joetannenbaum Aug 15, 2025
c4ab030
use new form component attributes for resetting
joetannenbaum Aug 15, 2025
fbcf149
Update Password.vue
joetannenbaum Aug 15, 2025
ad7570a
Merge pull request #173 from laravel/inertia-form-component
joetannenbaum Aug 15, 2025
4d931c8
update deps
taylorotwell Aug 18, 2025
8058f73
Standardise function usage (#175)
timacdonald Aug 21, 2025
8bb3219
Fix: Fix PHPStan error by chaining Stringable methods for email+IP (#…
Aluisio-Pires Aug 21, 2025
9e5a0f9
replace ziggy with wayfinder
joetannenbaum Aug 21, 2025
835cd4e
Update DeleteUser.vue
joetannenbaum Aug 21, 2025
073e5e3
Merge pull request #179 from laravel/fix-password-input-focus
joetannenbaum Aug 21, 2025
df389b1
adjust NavItems to accept link href type properties
joetannenbaum Aug 21, 2025
74290c3
Update NavFooter.vue
joetannenbaum Aug 21, 2025
c1807f4
Remove obsolete page props cast
herrmannplatz Aug 21, 2025
040231a
Merge pull request #180 from herrmannplatz:main
joetannenbaum Aug 22, 2025
d6f3adf
test: add tests for user authentication and email verification flows
JaavierR Aug 25, 2025
79345b1
Merge pull request #182 from JaavierR/tests/add-missing-test
joetannenbaum Aug 25, 2025
b3401e3
Merge pull request #178 from laravel/replace-ziggy-with-wayfinder
joetannenbaum Aug 25, 2025
699ffca
import full controller
joetannenbaum Aug 26, 2025
47b4cf7
Merge pull request #183 from laravel/import-from-controllers
joetannenbaum Aug 26, 2025
247c557
Use Named Routes for Tests
mathiasgrimm Aug 26, 2025
4ac620f
Update AuthenticationTest.php
joetannenbaum Aug 27, 2025
dfa9da7
Update AuthenticationTest.php
joetannenbaum Aug 27, 2025
d75312a
Merge pull request #184 from laravel/use-named-routes-for-tests
joetannenbaum Aug 27, 2025
db2dca1
Fix active state logic for sidebar menu items
hcancelik Sep 1, 2025
2b6d3ab
update config
taylorotwell Sep 2, 2025
98e83b9
Test Improvements (#186)
crynobone Sep 2, 2025
2b6d96d
centralized helper + added toUrl
joetannenbaum Sep 2, 2025
08df299
Merge pull request #185 from hcancelik/hotfix-navmain-active
joetannenbaum Sep 2, 2025
dbef74d
Standardise routes name
pushpak1300 Sep 5, 2025
066a3bc
Integrate PestPHP 4 Browser Tests
crynobone Sep 2, 2025
243b25d
Add Two Factor Authentication for Vue Starter Kit (#176)
pushpak1300 Sep 10, 2025
f485b1c
Add an error state in useTwoFactorAuth.ts
pushpak1300 Sep 12, 2025
636a6a7
Merge pull request #187 from laravel/pest-ci
joetannenbaum Sep 12, 2025
cd8ec84
Update .gitattributes
joetannenbaum Sep 12, 2025
904c9ff
Merge pull request #192 from laravel/fix-git-attribute
joetannenbaum Sep 12, 2025
a55a4c2
Bump dependencies to solve npm audit issues
AngelinCalu Sep 14, 2025
2db7baa
Correct LoginRequest retrieved user type to allow null
AngelinCalu Sep 14, 2025
4cdefaf
Merge pull request #193 from AngelinCalu/npm_audit_fix
joetannenbaum Sep 15, 2025
7e80fbe
Merge branch 'main' into feat/standardise_routes_names
joetannenbaum Sep 15, 2025
d537293
Merge pull request #188 from laravel:feat/standardise_routes_names
joetannenbaum Sep 15, 2025
d2bfb4d
Merge pull request #194 from AngelinCalu/hotfix/type_error
joetannenbaum Sep 15, 2025
2f6702c
Update eslint.config.js
joetannenbaum Sep 15, 2025
ba4ea28
Merge pull request #195 from laravel/eslint-pretter-flat
joetannenbaum Sep 15, 2025
5a9f934
Update `browser-tests.yml`
crynobone Sep 16, 2025
b86d7d8
Use and show the icon in the sidebarNavItems in the settings sidebar
HichemTab-tech Sep 17, 2025
d0b5d19
Merge pull request #196 from HichemTab-tech/use-sidebar-icon
joetannenbaum Sep 18, 2025
218a34c
change print width from 150 to 80
joetannenbaum Sep 18, 2025
ccdb9dd
Merge pull request #197 from laravel/prettier-print-width
joetannenbaum Sep 18, 2025
d121ef5
Merge branch 'main' into add_error_state_in_hook
pushpak1300 Sep 19, 2025
a071b28
Display errors in UI
pushpak1300 Sep 19, 2025
519ecfd
fix styles
joetannenbaum Sep 19, 2025
a43a468
Merge pull request #191 from laravel/add_error_state_in_hook
joetannenbaum Sep 19, 2025
78112ef
Add data-test attribute to sidebar menu button for testing
pushpak1300 Sep 22, 2025
9e67e42
Merge pull request #199 from laravel/add_test_attributes
joetannenbaum Sep 24, 2025
6646aee
regenerate token on register
taylorotwell Sep 29, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@

CHANGELOG.md export-ignore
README.md export-ignore
.github/workflows/browser-tests.yml export-ignore
69 changes: 69 additions & 0 deletions .github/workflows/browser-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
name: browser-tests

on:
push:
branches:
- develop
- main
pull_request:
branches:
- develop
- main

jobs:
ci:
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: 8.4
tools: composer:v2
coverage: xdebug

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'npm'

- name: Install Node Dependencies
run: npm ci

- name: Install Playwright Dependencies
run: npm install playwright@latest

- name: Install Playwright Browsers
run: npx playwright install --with-deps

- name: Add `laravel-labs/starter-kit-browser-tests` Repository
run: |
composer config repositories.browser-tests '{"type": "vcs", "url": "https://github.com/laravel-labs/starter-kit-browser-tests"}' --file composer.json
composer remove "phpunit/phpunit" --dev --no-update
composer require "laravel-labs/starter-kit-browser-tests:dev-main@dev" --dev --no-update

- name: Install Dependencies
run: composer install --no-interaction --prefer-dist --optimize-autoloader

- name: Copy Environment File
run: cp .env.example .env

- name: Generate Application Key
run: php artisan key:generate

- name: Setup Test Environment
run: |
cp vendor/laravel-labs/starter-kit-browser-tests/phpunit.xml.dist .
rm phpunit.xml
rm -Rf tests/
cp -rf vendor/laravel-labs/starter-kit-browser-tests/tests/ tests/

- name: Build Assets
run: npm run build

- name: Tests
run: php vendor/bin/pest
3 changes: 0 additions & 3 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,6 @@ jobs:
- name: Generate Application Key
run: php artisan key:generate

- name: Publish Ziggy Configuration
run: php artisan ziggy:generate

- name: Build Assets
run: npm run build

Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@
/public/storage
/storage/*.key
/storage/pail
/resources/js/actions
/resources/js/routes
/resources/js/wayfinder
/vendor
.DS_Store
.env
.env.backup
.env.production
Expand Down
1 change: 1 addition & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
resources/js/components/ui/*
resources/views/mail/*
14 changes: 11 additions & 3 deletions .prettierrc
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,17 @@
"singleQuote": true,
"singleAttributePerLine": false,
"htmlWhitespaceSensitivity": "css",
"printWidth": 150,
"plugins": ["prettier-plugin-organize-imports", "prettier-plugin-tailwindcss"],
"tailwindFunctions": ["clsx", "cn"],
"printWidth": 80,
"plugins": [
"prettier-plugin-organize-imports",
"prettier-plugin-tailwindcss"
],
"tailwindFunctions": [
"clsx",
"cn",
"cva"
],
"tailwindStylesheet": "resources/css/app.css",
"tabWidth": 4,
"overrides": [
{
Expand Down
14 changes: 13 additions & 1 deletion app/Http/Controllers/Auth/AuthenticatedSessionController.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use Illuminate\Support\Facades\Route;
use Inertia\Inertia;
use Inertia\Response;
use Laravel\Fortify\Features;

class AuthenticatedSessionController extends Controller
{
Expand All @@ -29,7 +30,18 @@ public function create(Request $request): Response
*/
public function store(LoginRequest $request): RedirectResponse
{
$request->authenticate();
$user = $request->validateCredentials();

if (Features::enabled(Features::twoFactorAuthentication()) && $user->hasEnabledTwoFactorAuthentication()) {
$request->session()->put([
'login.id' => $user->getKey(),
'login.remember' => $request->boolean('remember'),
]);

return to_route('two-factor.login');
}

Auth::login($user, $request->boolean('remember'));

$request->session()->regenerate();

Expand Down
41 changes: 0 additions & 41 deletions app/Http/Controllers/Auth/ConfirmablePasswordController.php

This file was deleted.

2 changes: 2 additions & 0 deletions app/Http/Controllers/Auth/RegisteredUserController.php
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ public function store(Request $request): RedirectResponse

Auth::login($user);

$request->session()->regenerate();

return to_route('dashboard');
}
}
7 changes: 1 addition & 6 deletions app/Http/Controllers/Auth/VerifyEmailController.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Auth\Events\Verified;
use Illuminate\Foundation\Auth\EmailVerificationRequest;
use Illuminate\Http\RedirectResponse;

Expand All @@ -18,11 +17,7 @@ public function __invoke(EmailVerificationRequest $request): RedirectResponse
return redirect()->intended(route('dashboard', absolute: false).'?verified=1');
}

if ($request->user()->markEmailAsVerified()) {
/** @var \Illuminate\Contracts\Auth\MustVerifyEmail $user */
$user = $request->user();
event(new Verified($user));
}
$request->fulfill();

return redirect()->intended(route('dashboard', absolute: false).'?verified=1');
}
Expand Down
8 changes: 2 additions & 6 deletions app/Http/Controllers/Settings/PasswordController.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
namespace App\Http\Controllers\Settings;

use App\Http\Controllers\Controller;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
Expand All @@ -16,12 +15,9 @@ class PasswordController extends Controller
/**
* Show the user's password settings page.
*/
public function edit(Request $request): Response
public function edit(): Response
{
return Inertia::render('settings/Password', [
'mustVerifyEmail' => $request->user() instanceof MustVerifyEmail,
'status' => $request->session()->get('status'),
]);
return Inertia::render('settings/Password');
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

namespace App\Http\Controllers\Settings;

use App\Http\Controllers\Controller;
use App\Http\Requests\Settings\TwoFactorAuthenticationRequest;
use Illuminate\Routing\Controllers\HasMiddleware;
use Illuminate\Routing\Controllers\Middleware;
use Inertia\Inertia;
use Inertia\Response;
use Laravel\Fortify\Features;

class TwoFactorAuthenticationController extends Controller implements HasMiddleware
{
/**
* Get the middleware that should be assigned to the controller.
*/
public static function middleware(): array
{
return Features::optionEnabled(Features::twoFactorAuthentication(), 'confirmPassword')
? [new Middleware('password.confirm', only: ['show'])]
: [];
}

/**
* Show the user's two-factor authentication settings page.
*/
public function show(TwoFactorAuthenticationRequest $request): Response
{
$request->ensureStateIsValid();

return Inertia::render('settings/TwoFactor', [
'twoFactorEnabled' => $request->user()->hasEnabledTwoFactorAuthentication(),
'requiresConfirmation' => Features::optionEnabled(Features::twoFactorAuthentication(), 'confirm'),
]);
}
}
23 changes: 23 additions & 0 deletions app/Http/Middleware/HandleAppearance.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\View;
use Symfony\Component\HttpFoundation\Response;

class HandleAppearance
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
View::share('appearance', $request->cookie('appearance') ?? 'system');

return $next($request);
}
}
1 change: 1 addition & 0 deletions app/Http/Middleware/HandleInertiaRequests.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ public function share(Request $request): array
'auth' => [
'user' => $request->user(),
],
'sidebarOpen' => ! $request->hasCookie('sidebar_state') || $request->cookie('sidebar_state') === 'true',
];
}
}
21 changes: 15 additions & 6 deletions app/Http/Requests/Auth/LoginRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

namespace App\Http\Requests\Auth;

use App\Models\User;
use Illuminate\Auth\Events\Lockout;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Str;
use Illuminate\Validation\ValidationException;

class LoginRequest extends FormRequest
Expand All @@ -33,15 +33,18 @@ public function rules(): array
}

/**
* Attempt to authenticate the request's credentials.
* Validate the request's credentials and return the user without logging them in.
*
* @throws \Illuminate\Validation\ValidationException
*/
public function authenticate(): void
public function validateCredentials(): User
{
$this->ensureIsNotRateLimited();

if (! Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) {
/** @var User|null $user */
$user = Auth::getProvider()->retrieveByCredentials($this->only('email', 'password'));

if (! $user || ! Auth::getProvider()->validateCredentials($user, $this->only('password'))) {
RateLimiter::hit($this->throttleKey());

throw ValidationException::withMessages([
Expand All @@ -50,6 +53,8 @@ public function authenticate(): void
}

RateLimiter::clear($this->throttleKey());

return $user;
}

/**
Expand All @@ -76,10 +81,14 @@ public function ensureIsNotRateLimited(): void
}

/**
* Get the rate limiting throttle key for the request.
* Get the rate-limiting throttle key for the request.
*/
public function throttleKey(): string
{
return Str::transliterate(Str::lower($this->string('email')).'|'.$this->ip());
return $this->string('email')
->lower()
->append('|'.$this->ip())
->transliterate()
->value();
}
}
Loading