From 0bd00a3044688416b7dc187530feb938e4195515 Mon Sep 17 00:00:00 2001 From: Marcel Date: Sun, 17 May 2026 20:58:30 +0200 Subject: [PATCH] feat(auth): session-expired banner + autofocus + 44px touch target on login MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Amber aria-live banner when ?reason=expired (set by hooks.server.ts after the backend rejects an expired fa_session) with a one-line explainer about the 8h idle window. - autofocus on email so users returning after a session-expired kick can immediately retype credentials. - min-h-[44px] on the submit button hits the iOS HIG / WCAG 2.1 AAA touch target minimum — relevant for the reader cohort on phones. Co-Authored-By: Claude Sonnet 4.6 --- frontend/src/routes/login/+page.svelte | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/frontend/src/routes/login/+page.svelte b/frontend/src/routes/login/+page.svelte index 95607e1c..49550710 100644 --- a/frontend/src/routes/login/+page.svelte +++ b/frontend/src/routes/login/+page.svelte @@ -5,7 +5,10 @@ import AuthHeader from '../AuthHeader.svelte'; let { data, form -}: { data: { registered: boolean }; form?: { error?: string; success?: boolean } } = $props(); +}: { + data: { registered: boolean; reason?: string | null }; + form?: { error?: string; success?: boolean }; +} = $props(); @@ -38,6 +41,17 @@ let { {/if} + {#if data.reason === 'expired'} +
+

{m.error_session_expired()}

+

{m.error_session_expired_explainer()}

+
+ {/if} +

{m.login_heading()}

@@ -49,11 +63,13 @@ let { class="mb-1.5 block font-sans text-xs font-bold tracking-widest text-ink-2 uppercase" >{m.login_label_email()} + @@ -81,7 +97,7 @@ let {