From 113d72790ac051b62ec07f230db80ff8bfc3c5e0 Mon Sep 17 00:00:00 2001 From: Yaroslav Kosterin Date: Thu, 20 Nov 2025 11:47:58 +0200 Subject: [PATCH 1/3] wcag improvements --- .../scss/includes/blocks/block-empty.scss | 2 +- .../scss/includes/blocks/block-fund.scss | 47 ++++++++++++------- .../templates/SelectControlOptionsFD.tsx | 7 +-- .../templates/SelectControlOptionsLang.tsx | 3 +- .../block-panel-group/PaneGroupPanel.tsx | 4 +- .../elements/forms/RangeControl.tsx | 5 +- .../templates/ProductsListItemGrid.tsx | 4 +- .../templates/ProductsListItemList.tsx | 4 +- .../components/elements/sections/Section.tsx | 15 +++++- .../components/elements/tooltip/Tooltip.tsx | 4 +- .../top-navbar/desktop/TopNavbarDesktop.tsx | 3 ++ .../modals/ModalIdentityProxyExpired.tsx | 2 +- .../components/modals/ModalNotification.tsx | 2 +- .../webshop/components/pages/auth/Start.tsx | 12 ++--- .../pages/fund-requests/FundRequests.tsx | 3 +- .../steps/FundRequestStepCriteriaOverview.tsx | 4 +- .../components/pages/funds-show/FundsShow.tsx | 38 +++++++-------- .../pages/identity-security/Security2FA.tsx | 6 ++- .../identity-security/SecuritySessions.tsx | 2 +- .../components/pages/payouts/Payouts.tsx | 15 ++++-- .../PushNotificationPreferencesCard.tsx | 15 ++++++ .../pages/products-show/ProductsShow.tsx | 2 +- .../components/pages/products/Products.tsx | 2 +- .../elements/ProductsFilterGroupProviders.tsx | 4 +- .../pages/providers-show/ProvidersShow.tsx | 6 ++- .../pages/reimbursements/Reimbursements.tsx | 3 +- .../reservations-show/ReservationsShow.tsx | 4 +- .../pages/reservations/Reservations.tsx | 9 ++-- .../pages/vouchers-show/VouchersShow.tsx | 2 +- react/src/webshop/i18n/nl/components/form.mjs | 2 + .../webshop/i18n/nl/directives/app-footer.mjs | 4 ++ .../src/webshop/i18n/nl/layout/top_navbar.mjs | 4 ++ .../nl/pages/preferences-notifications.mjs | 2 + react/src/webshop/i18n/nl/pages/provider.mjs | 1 + .../layout/elements/BlockSkipLinks.tsx | 9 +++- .../webshop/layout/elements/LayoutFooter.tsx | 8 +++- 36 files changed, 167 insertions(+), 92 deletions(-) diff --git a/react/assets/forus-webshop/scss/includes/blocks/block-empty.scss b/react/assets/forus-webshop/scss/includes/blocks/block-empty.scss index 72aba81ad..04ac81e6f 100644 --- a/react/assets/forus-webshop/scss/includes/blocks/block-empty.scss +++ b/react/assets/forus-webshop/scss/includes/blocks/block-empty.scss @@ -38,7 +38,7 @@ } .block-description { - font: 700 14px/20px var(--base-font); + font: 700 14px/24px var(--base-font); color: #646f79; margin: 0 0 35px; diff --git a/react/assets/forus-webshop/scss/includes/blocks/block-fund.scss b/react/assets/forus-webshop/scss/includes/blocks/block-fund.scss index c33adf0ef..e2848d89a 100644 --- a/react/assets/forus-webshop/scss/includes/blocks/block-fund.scss +++ b/react/assets/forus-webshop/scss/includes/blocks/block-fund.scss @@ -56,23 +56,23 @@ } .fund-details-items { - display: flex; - flex-direction: row; - - .fund-details-item { - flex-direction: column; - width: 100%; - - .fund-details-item-label { - font: 600 14px var(--base-font); - color: #646f79; - margin-bottom: 5px; - } + display: grid; + grid-auto-flow: column; + grid-auto-rows: auto auto; + gap: 5px 10px; + align-items: start; + + .fund-details-item-label { + font: 600 14px var(--base-font); + color: #646f79; + grid-row: 1; + } - .fund-details-item-value { - font: 600 16px var(--base-font); - color: #303030; - } + .fund-details-item-value { + font: 600 16px var(--base-font); + color: #303030; + grid-row: 2; + margin: 0; } } } @@ -90,8 +90,19 @@ } .fund-details-items { - gap: 20px; - flex-direction: column; + display: block; + + .fund-details-item-label { + margin-bottom: 5px; + } + + .fund-details-item-value { + margin-bottom: 20px; + + &:last-child { + margin-bottom: 0; + } + } } } } diff --git a/react/src/dashboard/components/elements/select-control/templates/SelectControlOptionsFD.tsx b/react/src/dashboard/components/elements/select-control/templates/SelectControlOptionsFD.tsx index 4f3be9601..e4eaf9693 100644 --- a/react/src/dashboard/components/elements/select-control/templates/SelectControlOptionsFD.tsx +++ b/react/src/dashboard/components/elements/select-control/templates/SelectControlOptionsFD.tsx @@ -62,8 +62,8 @@ export default function SelectControlOptionsFD({ aria-haspopup="listbox" aria-expanded={showOptions} aria-labelledby={ariaLabelledby || controlId} - aria-controls={`${controlId}_options`} - aria-activedescendant={modelValue ? `option_${modelValue.id}` : null} + aria-controls={showOptions ? `${controlId}_options` : null} + aria-activedescendant={showOptions && modelValue ? `option_${modelValue.id}` : null} ref={selectorRef} onKeyDown={(e) => (disabled ? null : onKeyDown(e))} onBlur={onBlur}> @@ -125,7 +125,7 @@ export default function SelectControlOptionsFD({ className="select-control-search form-control" onClick={searchOption} style={{ display: showOptions && allowSearch ? 'none' : 'block' }} - title={placeholderValue || placeholder}> + aria-label={placeholderValue || placeholder}> {placeholderValue || placeholder} @@ -142,6 +142,7 @@ export default function SelectControlOptionsFD({ value={query} tabIndex={0} onClick={onInputClick} + aria-controls={`${controlId}_options`} onChange={(e) => setQuery(e.target.value)} className="select-control-search form-control" /> diff --git a/react/src/dashboard/components/elements/select-control/templates/SelectControlOptionsLang.tsx b/react/src/dashboard/components/elements/select-control/templates/SelectControlOptionsLang.tsx index e27345233..f36911b49 100644 --- a/react/src/dashboard/components/elements/select-control/templates/SelectControlOptionsLang.tsx +++ b/react/src/dashboard/components/elements/select-control/templates/SelectControlOptionsLang.tsx @@ -50,7 +50,7 @@ export default function SelectControlOptionsLang({ data-dusk={dusk} aria-haspopup="listbox" aria-expanded={showOptions} - aria-labelledby={controlId} + aria-labelledby={allowSearch ? controlId : null} aria-controls={`${controlId}_options`} ref={selectorRef} onKeyDown={onKeyDown} @@ -59,7 +59,6 @@ export default function SelectControlOptionsLang({ {/* Placeholder */}