v0.319.0: the app page in panels, the login in one place, a password the box never had is said in words
gates / gates (push) Successful in 52s

- style A (operator 2026-10-16): hero, tab bar and every section are panels on --bg-1, one width, 16px apart;
  the install page's form groups use the same rule; the settings tab's 700px inner wrapper is gone
- „Belépés az alkalmazásba": name + password side by side, fetched on demand (R-254, R-709); pairing in app_login.go
- the empty-value rule: no stored value -> a sentence, never an eye; page and reveal endpoint share storedValuePresent
- „Cím és kulcsok" is rows (no Domain input, no disabled storage select, no install form); hint under the title
- tests red-proved: app_page_tuning_test.go (4); 36 app-page parity fixtures re-captured, 4 new; install fixtures unchanged

Claude-Session: https://claude.ai/code/session_012qRErfCoiTkvDK9N5XHbzb
This commit is contained in:
2026-10-16 12:12:06 +02:00
parent 8d44416610
commit d170a2aecf
58 changed files with 6046 additions and 1776 deletions
@@ -187,6 +187,18 @@ func i18nCasesA() []i18nCase {
{"deploy_new_memory_blocked", "deploy", func() map[string]interface{} {
return i18nDeployData(false, stacks.StateNotDeployed, 3)
}},
// v0.319.0: `/apps/{slug}/install` opened for an app that IS installed — the form read-only, its
// secrets fetched on demand. The settings tab stopped rendering this form, so these two cases are
// what renders its installed-app branches now.
{"deploy_installed", "deploy", func() map[string]interface{} {
return i18nDeployData(true, stacks.StateRunning, 1)
}},
{"deploy_installed_restored", "deploy", func() map[string]interface{} {
d := i18nDeployData(true, stacks.StateRunning, 1)
d["DeployedFieldValues"] = map[string]string{"SUBDOMAIN": "paste"}
d["RestoredLogins"] = map[string]bool{"ADMIN_PASSWORD": true}
return d
}},
{"app_settings_running", "app_settings", func() map[string]interface{} {
return i18nDeployData(true, stacks.StateRunning, 1)
}},
@@ -198,6 +210,26 @@ func i18nCasesA() []i18nCase {
d := i18nDeployData(true, stacks.StateRunning, 1)
d["DeployedFieldValues"] = map[string]string{"SUBDOMAIN": "paste"}
d["RestoredLogins"] = map[string]bool{"ADMIN_PASSWORD": true}
d["LoginFields"] = []AppLoginField{{EnvVar: "ADMIN_PASSWORD", Label: "Admin jelszó mező", OnDemand: true, Stored: true, Restored: true}}
return d
}},
// v0.319.0: the box holds no login value (Calibre-Web installed before its template had one) —
// a sentence for each half, never an eye that answers 404.
{"app_settings_login_not_stored", "app_settings", func() map[string]interface{} {
d := i18nDeployData(true, stacks.StateRunning, 1)
d["LoginFields"] = []AppLoginField{
{EnvVar: "ADMIN_USER", Label: "Admin név mező", IsName: true, OnDemand: true},
{EnvVar: "ADMIN_PASSWORD", Label: "Admin jelszó mező", OnDemand: true},
}
return d
}},
// v0.319.0: a plain-text login name (Nextcloud, Paperless) is shown as text beside the password.
{"app_settings_login_text_name", "app_settings", func() map[string]interface{} {
d := i18nDeployData(true, stacks.StateRunning, 2)
d["LoginFields"] = []AppLoginField{
{EnvVar: "PAPERLESS_ADMIN_USER", Label: "Admin név mező", IsName: true, Value: "konyveles", Stored: true},
{EnvVar: "PAPERLESS_ADMIN_PASSWORD", Label: "Admin jelszó mező", OnDemand: true, Stored: true},
}
return d
}},
{"settings_system_full", "settings_system", func() map[string]interface{} {
@@ -399,5 +431,18 @@ func i18nDeployData(deployed bool, st stacks.ContainerState, variant int) map[st
d["CurrentHDDPathMissing"] = true
d["StoragePaths"] = nil
}
// v0.319.0: the settings tab's login panel and „Cim es kulcsok" rows (app_login.go). The install
// page reads neither key, so its fixtures do not move.
if deployed {
d["CurrentHDDLabel"] = "HDD egy"
d["LoginFields"] = []AppLoginField{
{EnvVar: "ADMIN_USER", Label: "Admin név mező", IsName: true, OnDemand: true, Stored: true},
{EnvVar: "ADMIN_PASSWORD", Label: "Admin jelszó mező", OnDemand: true, Stored: true},
}
d["SettingsRows"] = []AppSettingRow{
{EnvVar: "SECRET_KEY", Label: "Titkos kulcs érték", OnDemand: true},
{EnvVar: "LANG_SEL", Label: "Felület nyelve", Value: "Magyar nyelv"},
}
}
return d
}