From cce3dde5abeed8dd1fef1fa426b5ca1c4313e7da Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 19 Jul 2026 20:58:13 +0200 Subject: [PATCH] fix(a11y): show the password hint visually but hide it from screen readers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Restores the "e.g. ••••" hint that the previous commit removed, as an aria-hidden overlay instead of a native placeholder — screen readers read native placeholders character by character. FormField gets a decorativePlaceholder prop for the link-share fields, and the link-share auth field gains the aria-label it never had (its placeholder used to be its only hint). Re-using the translation key also fixes the dead-key CI failure. Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP --- frontend/src/components/input/FormField.vue | 11 +++++++++++ frontend/src/components/input/Password.vue | 7 +++++++ frontend/src/components/sharing/LinkSharing.vue | 1 + frontend/src/styles/theme/form.scss | 11 +++++++++++ frontend/src/views/sharing/LinkSharingAuth.vue | 2 ++ 5 files changed, 32 insertions(+) diff --git a/frontend/src/components/input/FormField.vue b/frontend/src/components/input/FormField.vue index 389e8bde6..348e76bd6 100644 --- a/frontend/src/components/input/FormField.vue +++ b/frontend/src/components/input/FormField.vue @@ -9,6 +9,10 @@ interface Props { disabled?: boolean loading?: boolean layout?: 'stacked' | 'two-col' + // Shown like a placeholder but hidden from assistive technology — + // screen readers read native placeholders character by character + // for hints like "e.g. ••••••••••••". + decorativePlaceholder?: string } const props = withDefaults(defineProps(), { @@ -129,6 +133,13 @@ defineExpose({ :aria-describedby="errorId" @input="handleInput" > +
+