blade(
''
);
$html->assertSee('No tags yet')
->assertSee('Add a tag to group deployments.')
->assertSee('empty-state', false)
->assertSee('border-dashed', false)
->assertSee('min-h-80', false);
});
it('renders empty states flush with no outer inset inside settings sections', function () {
$html = $this->blade(
<<<'BLADE'
BLADE
);
$html->assertSee('is-flush', false)
->assertSee('empty-state', false)
->assertSee('No scheduled tasks');
$css = file_get_contents(resource_path('css/app.css'));
expect($css)
->toContain('.application-settings-section-body.is-flush .empty-state')
->toContain('.application-settings-section-body:has(> .empty-state:only-child)')
->toContain('.application-settings-section > .empty-state')
->toMatch('/\.application-settings-section-body\.is-flush \.empty-state[\s\S]*?margin:\s*0/');
});
it('insets empty states nested inside a flush settings section wrapper', function () {
$css = file_get_contents(resource_path('css/app.css'));
expect($css)->toContain('.application-settings-section-body.is-flush > div:has(> .empty-state:only-child)');
});
it('renders the backup executions empty state without a scrollable table', function () {
$view = file_get_contents(resource_path('views/livewire/project/database/backup-executions.blade.php'));
expect($view)
->toMatch('/@if \(\$executions_count === 0\)\s*
\s*
toMatch('/@else\s*/')
->not->toContain('@forelse ($executions as $execution)');
});
it('keeps backup execution actions compact', function () {
$css = file_get_contents(resource_path('css/app.css'));
$view = file_get_contents(resource_path('views/livewire/project/database/backup-executions.blade.php'));
expect($css)
->toContain('grid-template-columns: 6.5rem minmax(7rem, 0.8fr) minmax(14rem, 1.5fr) 7rem 5rem 4rem minmax(8rem, 1fr) 5rem;')
->and($view)
->toContain('Actions')
->toContain('class="flex items-center justify-end gap-1"')
->not->toContain('sticky right-0')
->toContain('title="Download backup" aria-label="Download backup"')
->toContain('')
->toContain('title="Delete backup" aria-label="Delete backup"')
->toContain('');
});
it('uses the compact resource table styling for backup executions', function () {
$view = file_get_contents(resource_path('views/livewire/project/database/backup-executions.blade.php'));
$css = file_get_contents(resource_path('css/app.css'));
expect($view)
->toContain('class="data-table deployment-table-scroll backup-executions-table-scroll"')
->toContain('data-table-header backup-executions-table-grid h-auto rounded-none px-4 py-2.5 text-[11px]')
->toContain('data-table-row backup-executions-table-grid min-h-14 border-b border-neutral-200 px-4 py-2.5 dark:border-white/[0.06]')
->toContain('class="backup-execution-row"')
->toContain('flex min-h-11 items-center justify-between border-t')
->and($css)
->toMatch('/\.backup-executions-table-scroll\s*\{[^}]*overflow-x:\s*auto;/')
->toMatch('/\.backup-execution-row:last-child > \.data-table-row\s*\{[^}]*border-bottom:\s*0;/')
->toMatch('/\.backup-executions-table-grid\s*\{[^}]*gap:\s*0\.75rem;[^}]*min-width:\s*66rem;/');
});
it('renders compact size without the full-page min height class', function () {
$html = $this->blade(
''
);
$html->assertSee('No cloud tokens')
->assertSee('min-h-44', false)
->assertDontSee('min-h-80', false);
});
it('renders action content from both contents and actions slots', function () {
$contents = $this->blade(
''
);
$contents->assertSee('From contents');
$actions = $this->blade(
''
);
$actions->assertSee('From actions');
});