From 337c8e8f0e09bb8bf422c213cdc57ec48e4a0da2 Mon Sep 17 00:00:00 2001 From: Mikhail Yenuchenko Date: Mon, 3 Aug 2026 16:21:09 +0300 Subject: [PATCH] panel: stack Add an application above the list, drop the two-column row MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The side-by-side .split row read badly: main is capped at 48rem, so the applications table had to live in roughly 27rem and its actions column squeezed four controls into it. Put the create form directly above the list instead — the order the domains page already uses for "Add a sending domain" above "Domains" — and delete .split, which nothing else used. The empty-state text follows the same page's wording. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 6 +-- internal/web/static/panel.css | 7 --- internal/web/templates/domain_detail.html | 65 +++++++++++------------ 3 files changed, 33 insertions(+), 45 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0fc018..f3624bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,9 +21,9 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); version They are all buttons now: filled for a card's own action, compact and outlined where actions cluster in a table row or the nav bar. An `` is once again only used for navigation. -- panel: on the domain page, **Applications** and **Add an application** sit - side by side on a wide viewport instead of the form being stranded below the - domain rate limit; they stack again on a narrow one. +- panel: on the domain page **Add an application** now sits directly above the + **Applications** list — the same order the domains page uses for its own add + form — instead of being stranded below the domain rate limit. - ci: hermetic container e2e suite (`test/e2e`, a separate Go module) gates image publishing — `make e2e` locally, and `go test ./...` in `test/e2e` as a required step in `release.yml` before a version tag's image is pushed. diff --git a/internal/web/static/panel.css b/internal/web/static/panel.css index fcf03be..cd3a9e8 100644 --- a/internal/web/static/panel.css +++ b/internal/web/static/panel.css @@ -49,13 +49,6 @@ button:hover { background: #1d4ed8; } form.inline { display: inline; margin: 0; } main { max-width: 48rem; } .card + .card { margin-top: 1.2rem; } -/* Two cards side by side on a wide viewport; below 52rem the columns collapse - and the grid gap keeps the same vertical rhythm as .card + .card. The inner - margin-top is cleared because the gap already spaces the pair. */ -.split { display: grid; grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr); gap: 1.2rem; align-items: start; } -.split > .card + .card { margin-top: 0; } -.card + .split, .split + .card { margin-top: 1.2rem; } -@media (max-width: 52rem) { .split { grid-template-columns: minmax(0, 1fr); } } .flash { background: #ecfdf3; border: 1px solid #abefc6; color: #067647; padding: 0.7rem 1rem; border-radius: 8px; margin-bottom: 1.2rem; } @media (prefers-color-scheme: dark) { .flash { background: #0d2818 !important; border-color: #1a5336 !important; color: #75d99b !important; } } table { width: 100%; border-collapse: collapse; } diff --git a/internal/web/templates/domain_detail.html b/internal/web/templates/domain_detail.html index 684b1b4..da04ef8 100644 --- a/internal/web/templates/domain_detail.html +++ b/internal/web/templates/domain_detail.html @@ -144,11 +144,35 @@ lost, generate a new one.

-{{/* Applications and its create form sit side by side on a wide viewport: the - table is read far more often than the form, and pairing them saves scrolling - past the list to add one. On a narrow viewport the .split grid stacks them - again, list first. */}} -
+{{/* Create form above the list, the same order the domains page uses for + "Add a sending domain" above "Domains". */}} +
+

Add an application

+
+ + + + + + +
+ + +
+ + {{if .Error}}

{{.Error}}

{{end}} + +
+

A strong password is generated and shown once. The login must + be unique across all domains and may contain letters, digits, '.', '-' and '_'.

+
+

Applications

Each application is a SASL login/password an app or script @@ -220,39 +244,10 @@ {{else}} -

No applications yet. Create the first one with the - Add an application form.

+

No applications yet. Add one above to get started.

{{end}}
-
-

Add an application

-
- - - - - - -
- - -
- - {{if .Error}}

{{.Error}}

{{end}} - -
-

A strong password is generated and shown once. The login must - be unique across all domains and may contain letters, digits, '.', '-' and '_'.

-
-
-

Sending rate limit (domain)

Optional level-2 limit (spec 7.4): cap how many messages this