feat(ui): polish domains UX and dark-mode loading accents

Group service domain tables with inline redirect controls, live-save
redirects without full refreshes, and only auto-pair www hosts when a
www redirect is active. Align helper tooltips, server-timing HUD, and
loading spinners with dark-theme accents; default theme-color to dark.
This commit is contained in:
Andras Bacsai committed 2026-08-06 13:18:46 +02:00
1 parent 232b999cc9
commit bb83c1e3be
19 files changed
+404 -176

No files matched your search

@@ -94,6 +94,60 @@ it('opens service environment variables domains and storages pages', function ()
->screenshot(filename: 'service-storages');
});
it('renders an automatically added redirect counterpart without reloading', function () {
$this->serviceApplication->update([
'fqdn' => 'https://web.example.com',
'redirect' => 'both',
]);
loginAndSkipBoarding();
$base = serviceConfigurationUrl(
$this->stack['project'],
$this->stack['environment'],
$this->service
);
$page = visit("{$base}/domains")
->assertSee('https://web.example.com');
$selector = '#service-domain-redirect-'.$this->serviceApplication->id;
$page->select($selector, 'www')
->wait(3);
$this->serviceApplication->refresh();
expect($this->serviceApplication->redirect)->toBe('www');
$page->assertSee('https://www.web.example.com')
->screenshot(filename: 'service-domain-redirect-counterpart');
$page->script(<<<'JS'
(() => {
const domain = document.querySelector('a[title="https://www.web.example.com"]');
domain.closest('.env-table-item').querySelector('[aria-label="Remove domain"]').click();
})()
JS);
$page->wait(0.5)
->script(<<<'JS'
(() => {
const button = [...document.querySelectorAll('button')]
.find((candidate) => candidate.offsetParent && candidate.textContent.trim() === 'Remove domain');
button.click();
})()
JS);
$page->wait(3);
$configuredCounterparts = $page->script(
'document.querySelectorAll(\'a[title="https://www.web.example.com"]\').length'
);
expect($configuredCounterparts)->toBe(0);
$page->screenshot(filename: 'service-domain-remove-without-reload');
});
it('opens compose stack application general settings', function () {
loginAndSkipBoarding();