From a23f999eeeb7102dee860e48a050cb7c138afcc9 Mon Sep 17 00:00:00 2001 From: Moritz Date: Wed, 18 Feb 2026 22:48:56 +0100 Subject: [PATCH] fix(a11y): WCAG 2 AA contrast and keyboard access --- assets/css/app.css | 19 +++++++++++++++++++ lib/mv_web/live/global_settings_live.ex | 4 ++-- .../show/membership_fees_component.ex | 9 +++++++-- priv/gettext/de/LC_MESSAGES/default.po | 5 +++++ priv/gettext/default.pot | 5 +++++ priv/gettext/en/LC_MESSAGES/default.po | 5 +++++ 6 files changed, 43 insertions(+), 4 deletions(-) diff --git a/assets/css/app.css b/assets/css/app.css index 0219e1e..0149c5d 100644 --- a/assets/css/app.css +++ b/assets/css/app.css @@ -99,6 +99,25 @@ /* Make LiveView wrapper divs transparent for layout */ [data-phx-session] { display: contents } +/* WCAG 1.4.12 Text Spacing: allow user stylesheets to adjust text spacing in popovers. + Popover content (e.g. from DaisyUI dropdown) must not rely on non-overridable inline + spacing; use inherited values so custom stylesheets can override. */ +[popover] { + line-height: inherit; + letter-spacing: inherit; + word-spacing: inherit; +} + +/* WCAG 2 AA: success/error text on light backgrounds (e.g. base-200). Use instead of + text-success/text-error when contrast ratio of theme colors is insufficient. */ +.text-success-aa { + color: oklch(0.35 0.12 165); +} + +.text-error-aa { + color: oklch(0.45 0.2 25); +} + /* ============================================ Sidebar Base Styles ============================================ */ diff --git a/lib/mv_web/live/global_settings_live.ex b/lib/mv_web/live/global_settings_live.ex index fc91b03..1a7e13b 100644 --- a/lib/mv_web/live/global_settings_live.ex +++ b/lib/mv_web/live/global_settings_live.ex @@ -366,9 +366,9 @@ defmodule MvWeb.GlobalSettingsLive do

{gettext("Last sync result:")} - {gettext("%{count} synced", count: @result.synced)} + {gettext("%{count} synced", count: @result.synced)} <%= if @result.errors != [] do %> - + {gettext("%{count} failed", count: length(@result.errors))} <% end %> diff --git a/lib/mv_web/live/member_live/show/membership_fees_component.ex b/lib/mv_web/live/member_live/show/membership_fees_component.ex index ce14317..02c9d66 100644 --- a/lib/mv_web/live/member_live/show/membership_fees_component.ex +++ b/lib/mv_web/live/member_live/show/membership_fees_component.ex @@ -66,7 +66,7 @@ defmodule MvWeb.MemberLive.Show.MembershipFeesComponent do href={Mv.Config.vereinfacht_contact_view_url(@member.vereinfacht_contact_id)} target="_blank" rel="noopener noreferrer" - class="link link-primary inline-flex items-center gap-1" + class="link link-accent underline inline-flex items-center gap-1" > {gettext("View contact in Vereinfacht")} <.icon name="hero-arrow-top-right-on-square" class="inline-block size-4" /> @@ -83,7 +83,12 @@ defmodule MvWeb.MemberLive.Show.MembershipFeesComponent do

<%= if @vereinfacht_debug_response do %> -
+
<%= format_vereinfacht_debug_response(@vereinfacht_debug_response) %>
<% end %> diff --git a/priv/gettext/de/LC_MESSAGES/default.po b/priv/gettext/de/LC_MESSAGES/default.po index c3fbc0c..b9bc053 100644 --- a/priv/gettext/de/LC_MESSAGES/default.po +++ b/priv/gettext/de/LC_MESSAGES/default.po @@ -2754,6 +2754,11 @@ msgstr "Für dieses Mitglied existiert kein Vereinfacht-Kontakt." msgid "Sync this member from Settings (Vereinfacht section) or save the member again to create the contact." msgstr "Synchronisieren Sie dieses Mitglied unter Einstellungen (Bereich Vereinfacht) oder speichern Sie das Mitglied erneut, um den Kontakt anzulegen." +#: lib/mv_web/live/member_live/show/membership_fees_component.ex +#, elixir-autogen, elixir-format, fuzzy +msgid "Vereinfacht API response" +msgstr "Vereinfacht" + #~ # Vereinfacht API validation messages (Laravel-style, shown when creating/editing members or syncing) #~ msgid "The address field is required." #~ msgstr "Das Adressfeld ist erforderlich." diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index 0fa186c..4e103b5 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -2753,3 +2753,8 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Sync this member from Settings (Vereinfacht section) or save the member again to create the contact." msgstr "" + +#: lib/mv_web/live/member_live/show/membership_fees_component.ex +#, elixir-autogen, elixir-format +msgid "Vereinfacht API response" +msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index e1f8ec6..7cf8ab9 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -2754,6 +2754,11 @@ msgstr "" msgid "Sync this member from Settings (Vereinfacht section) or save the member again to create the contact." msgstr "Sync this member from Settings (Vereinfacht section) or save the member again to create the contact." +#: lib/mv_web/live/member_live/show/membership_fees_component.ex +#, elixir-autogen, elixir-format, fuzzy +msgid "Vereinfacht API response" +msgstr "" + #~ # Vereinfacht API validation messages (Laravel-style, shown when creating/editing members or syncing) #~ msgid "The address field is required." #~ msgstr "The address field is required."