From f59f4778c9b701bbdca289a17a94201a179da996 Mon Sep 17 00:00:00 2001 From: Mix Date: Fri, 9 Oct 2026 23:33:26 +0300 Subject: [PATCH] panel-redesign: sign-in without an administrator follows its mockup - panel.css: .sp-signin-form .sp-form, as theme.css has it now. - templates/login.html: the state is div.sp-form with the mockup's heading and line; the empty form of ef8a82e is gone. - tests: the hint is checked by its new wording, and that the page carries no form at all. Evidence - docs/assets/panel-redesign/evidence/login-no-admin.png: 1440x900, headless Edge, real templates served locally (no Docker here). login.png re-shot after the selector change: byte-identical. - go test -count=1 ./internal/web/... : ok (web, auth, handlers, validate, view) Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 5 +++++ .../panel-redesign/evidence/login-no-admin.png | Bin 0 -> 44098 bytes internal/web/auth/handlers_test.go | 2 +- internal/web/view/signin_test.go | 7 +++---- internal/web/view/static/panel.css | 2 +- internal/web/view/templates/login.html | 13 +++++-------- 6 files changed, 15 insertions(+), 14 deletions(-) create mode 100644 docs/assets/panel-redesign/evidence/login-no-admin.png diff --git a/CHANGELOG.md b/CHANGELOG.md index c0c6583..36d613c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -71,6 +71,11 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); version the component kit. Sign in names the mail host above its title; a refused attempt is shown as a notice above the fields. `login` and `setup` are off the ratchet. +- panel-redesign (design): the sign-in page before any administrator exists + is a drawn screen (`login-no-admin`): the heading *No administrator yet* and + the pointer to the one-time setup link, in the same column as the form. The + signed-out column is sized through `.sp-form`, not through `form` (owner, + 2026-10-09). ### Changed diff --git a/docs/assets/panel-redesign/evidence/login-no-admin.png b/docs/assets/panel-redesign/evidence/login-no-admin.png new file mode 100644 index 0000000000000000000000000000000000000000..d5837feb300d063ba28339827751ffcff2125301 GIT binary patch literal 44098 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

9hzR|0sZX8E+>9`((>z%H9MwD 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 literal 0 HcmV?d00001 diff --git a/internal/web/auth/handlers_test.go b/internal/web/auth/handlers_test.go index 7bfa250..c8651c0 100644 --- a/internal/web/auth/handlers_test.go +++ b/internal/web/auth/handlers_test.go @@ -133,7 +133,7 @@ func TestLoginPointsAtSetupBeforeTheFirstAdministrator(t *testing.T) { t.Fatalf("status = %d, want 200", rec.Code) } body := rec.Body.String() - if !strings.Contains(body, "No administrator has been created yet") { + if !strings.Contains(body, "No administrator yet") || !strings.Contains(body, "one-time setup link") { t.Errorf("the login page does not point at the setup link:\n%s", body) } if strings.Contains(body, `name="password"`) { diff --git a/internal/web/view/signin_test.go b/internal/web/view/signin_test.go index 0104d2a..406a883 100644 --- a/internal/web/view/signin_test.go +++ b/internal/web/view/signin_test.go @@ -53,12 +53,11 @@ func TestLoginShowsAnErrorEscaped(t *testing.T) { func TestLoginWithoutAnAdministratorHasNoForm(t *testing.T) { out := renderSignedOut(t, "login", NewLoginSetupHint("mail.example.org")) - if !strings.Contains(out, "No administrator has been created yet") { + if !strings.Contains(out, "No administrator yet") || !strings.Contains(out, "one-time setup link") { t.Error("the setup hint is missing") } - // The element stays (the signed-out layout centres the column through it) but - // nothing in it can be filled in or sent. - for _, bad := range []string{`action=`, ` +{{/* Mockup login-no-admin.html: the same column, not a form. */}} +
{{if .Host}}

{{template "kicker" .Host}}

{{end}} -

Sign in

-

No administrator has been created yet. Open the one-time - setup link printed in the container log to get started.

- +

No administrator yet

+

Open the one-time setup link printed in the container log to create one.

+
{{else}}
{{if .Host}}

{{template "kicker" .Host}}

{{end}}