feat(ui): unify team, security, and notification settings layouts

Extract shared settings-layout components and a dedicated team
danger-zone page. Enable modal editing for security resources,
polish OAuth/API-token controls, and align notification and
service configuration UI with the new navigation patterns.
This commit is contained in:
Andras Bacsai
2026-08-05 16:24:31 +02:00
parent 5842d77b81
commit 2291c3fa1c
83 changed files with 1585 additions and 597 deletions
@@ -4,40 +4,48 @@
* Settings title sits above the workspace; sidebar is below it. Title shell and
* workspace share max-w-[1180px] so their left edges align.
*/
test('settings navbar and workspace share the same max width shell', function () {
$navbar = file_get_contents(resource_path('views/components/settings/navbar.blade.php'));
test('instance settings pages use one shared sidebar workspace', function () {
$layout = file_get_contents(resource_path('views/components/settings/layout.blade.php'));
expect($navbar)
expect($layout)
->toContain('max-w-[1180px]')
->toContain("title' => 'Settings'")
->toContain(':titleOnDesktop="false"');
->toContain('application-settings-navigation')
->toContain("'Configuration' =>")
->toContain("'Instance' =>");
$pages = [
resource_path('views/livewire/settings/index.blade.php'),
resource_path('views/livewire/settings/advanced.blade.php'),
resource_path('views/livewire/settings/updates.blade.php'),
resource_path('views/livewire/settings-oauth.blade.php'),
resource_path('views/livewire/settings-backup.blade.php'),
resource_path('views/livewire/settings-email.blade.php'),
resource_path('views/livewire/settings/scheduled-jobs.blade.php'),
];
foreach ($pages as $path) {
$blade = file_get_contents($path);
expect($blade)
->toContain('<x-settings.navbar')
->toContain('max-w-[1180px]')
->toContain('xl:grid-cols-[210px_minmax(0,1fr)]')
->toContain('<x-settings.layout>')
->not->toContain('<x-settings.navbar')
->not->toContain('x-settings.page-header');
}
$oauth = file_get_contents(resource_path('views/livewire/settings-oauth.blade.php'));
expect($oauth)
->toContain('<x-slot:submenu>')
->toContain('aria-label="OAuth providers"')
->toContain('window.scrollToSettingsSection?.')
->toContain('history.replaceState')
->not->toContain('xl:grid-cols-[210px_minmax(0,1fr)]');
});
test('dashboard navbar hides family titles at lg by default', function () {
$dashboardNavbar = file_get_contents(resource_path('views/components/dashboard/navbar.blade.php'));
$settingsNavbar = file_get_contents(resource_path('views/components/settings/navbar.blade.php'));
expect($dashboardNavbar)
->toContain("'titleOnDesktop' => false")
->toContain("'lg:hidden' => ! \$titleOnDesktop");
->toContain("'lg:hidden' => \$mobileTitleOnly || (! \$titleOnDesktop && \$showNav)");
expect($settingsNavbar)
->toContain(':titleOnDesktop="false"');
});