Bug 34973: Upgrade Font Awesome in the OPAC to 7.2

We are using Font Awesome 6.3 in the OPAC. The current version is 7.2.
Upgrading will eliminate the repeated warnings in the browser console
about "Glyph bbox was incorrect."

The patch adds Font Awesome to the list of packages in node_modules and
moves the Font Awesome SCSS into _common.scss so that it can be bundled
along with Bootstrap and other 3rd party assets.

Despite the fact that _common.scss grabs FA SCSS files directly from
node_modules I've added the FA font files to css/fonts. I was unable to
see how to reference the webfonts directory in
node_modules/@fortawesome.

The many changed .inc and .tt files are a result of a missed aspect of
our upgrade to Bootstrap 5. The "sr-only" class was removed in BS5 but
the Font Awesome CSS included its own "sr-only" class. This made up for
the fact that we missed the required upgrade to BS5's "visually-hidden."
As soon as Font Awesome's "sr-only" was gone all these mistakes were
made visible.

To test, apply the patch and run 'yarn install.'
- Rebuild the OPAC SCSS.
- Clear your browser cache.
- Test many pages in the OPAC to confirm that no icons are missing.
- Check changes to the templates to confirm that "sr-only" has been
  replaced with "visually-hidden."
  - Places where a broken "sr-only" class would be obvious: Star ratings
    on the user summary page, <legend>s on the search history page.

Sponsored-by: Athens County Public Libraries
Signed-off-by: David Nind <david@davidnind.com>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
This commit is contained in:
Owen Leonard 2026-05-05 15:42:55 +00:00 committed by Lucas Gass
parent 855e7669d4
commit 4c9604d1a7
No known key found for this signature in database
GPG Key ID: 60B447398B0D36CA
63 changed files with 120 additions and 133 deletions

View File

@ -1,3 +1,12 @@
@use "~@fortawesome/fontawesome-free/scss/variables" with (
// customizing $font-path
$font-path: "./fonts"
);
@use "~@fortawesome/fontawesome-free/scss/fontawesome";
@use "~@fortawesome/fontawesome-free/scss/fa" as fa;
@use "~@fortawesome/fontawesome-free/scss/solid" as fa-solid;
@use "~@fortawesome/fontawesome-free/scss/brands" as fa-brands;
/* Bootstrap variable customizations */
:root {
@ -357,7 +366,7 @@ textarea,
&::before {
color: #4466AE;
display: inline-block;
font-family: "Font Awesome 6 Free";
font-family: "Font Awesome 7 Free";
padding-right: .5em;
}
@ -423,7 +432,7 @@ div.dt-button-collection button.dt-button.buttons-columnVisibility::before {
color: #C00;
content: "\f00d";
display: inline-block;
font-family: "Font Awesome 6 Free";
font-family: "Font Awesome 7 Free";
margin-right: .5em;
width: 1em;
}
@ -438,7 +447,7 @@ div.dt-button-collection button.dt-button.buttons-columnVisibility:hover::before
color: #538200;
content: "\f00c";
display: inline-block;
font-family: "Font Awesome 6 Free";
font-family: "Font Awesome 7 Free";
margin-right: .5em;
width: 1em;
}
@ -462,7 +471,7 @@ div.dt-button-collection button.dt-button.buttons-columnVisibility.active:hover:
color: #C00;
content: "\f00d";
display: inline-block;
font-family: "Font Awesome 6 Free";
font-family: "Font Awesome 7 Free";
margin-right: .5em;
width: 1em;
}
@ -476,7 +485,7 @@ div.dt-button-collection button.dt-button.buttons-columnVisibility.active::befor
color: $base-theme-color;
content: "\f00c";
display: inline-block;
font-family: "Font Awesome 6 Free";
font-family: "Font Awesome 7 Free";
margin-right: .5em;
width: 1em;
}
@ -500,7 +509,7 @@ div.dt-button-collection button.dt-button.buttons-print:hover {
div.dt-button-collection button.dt-button.buttons-html5:not( .disabled )::before {
color: #222BAC;
display: inline-block;
font-family: "Font Awesome 6 Free";
font-family: "Font Awesome 7 Free";
margin-right: .5em;
width: 1em;
}
@ -521,7 +530,7 @@ div.dt-button-collection button.dt-button.buttons-print:not( .disabled )::before
color: #222BAC;
content: "\f02f";
display: inline-block;
font-family: "Font Awesome 6 Free";
font-family: "Font Awesome 7 Free";
margin-right: .5em;
width: 1em;
}
@ -664,7 +673,7 @@ div.dt-container .dt-length {
&::before,
&::after {
display: inline-block;
font-family: "Font Awesome 6 Free";
font-family: "Font Awesome 7 Free";
width: 1em;
}
}
@ -879,7 +888,7 @@ table {
&.dt-orderable-desc span.dt-column-order::after,
&.dt-ordering-desc span.dt-column-order::after {
display: block;
font-family: "Font Awesome 6 Free";
font-family: "Font Awesome 7 Free";
font-size: 1rem;
line-height: .5rem;
}

View File

@ -381,7 +381,7 @@
&::before {
content: "\f0da";
display: inline-block;
font-family: "Font Awesome 6 Free";
font-family: "Font Awesome 7 Free";
width: 1em;
}
}
@ -407,7 +407,7 @@
&::before {
content: "\f0d7";
display: inline-block;
font-family: "Font Awesome 6 Free";
font-family: "Font Awesome 7 Free";
width: 1em;
}
}

View File

@ -496,6 +496,7 @@ th {
margin: 0 2px;
padding: 2px 4px;
text-shadow: 1px 0 1px rgba( 0, 0, 0, .25 );
width: 1.6em;
&.rsssearchicon {
font-size: 70%;
@ -1906,7 +1907,7 @@ nav {
.facet-toggle::before {
color: #5A5A5A;
content: "\f0da";
font-family: "Font Awesome 6 Free";
font-family: "Font Awesome 7 Free";
font-size: 90%;
line-height: 1.5em;
padding: 0 0.35em 0 0;
@ -1923,7 +1924,7 @@ nav {
color: #5A5A5A;
content: "\f0c8";
cursor: default;
font-family: "Font Awesome 6 Free";
font-family: "Font Awesome 7 Free";
font-size: 50%;
line-height: 1.5em;
padding: .7em 1em 0 0;
@ -2715,7 +2716,7 @@ $star-selected: #EDB867;
white-space: nowrap;
span,a {
font: normal normal normal 20px/1 "Font Awesome 6 Free";
font: normal normal normal 20px/1 "Font Awesome 7 Free";
-webkit-font-smoothing: antialiased;
margin-right: 2px;
text-decoration: none;

View File

@ -4,7 +4,7 @@
<input type="hidden" name="op" value="cud-pay" />
[% IF ( ACCOUNT_LINES ) %]
<table class="table table-bordered table-striped finestable" id="finestable">
<caption class="sr-only">Your charges</caption>
<caption class="visually-hidden">Your charges</caption>
<thead>
<tr>
[% IF ENABLE_OPAC_PAYMENTS %]<th>&nbsp;</th>[% END %]

View File

@ -85,8 +85,5 @@
[% Asset.js('js/i18n.js') | $raw %]
[% Asset.js('js/stores.js') | $raw %]
[% Asset.css("lib/fontawesome/css/fontawesome.min.css") | $raw %]
[% Asset.css("lib/fontawesome/css/brands.min.css") | $raw %]
[% Asset.css("lib/fontawesome/css/solid.min.css") | $raw %]
[% PROCESS 'html_helpers.inc' %]
[% KohaPlugins.get_plugins_opac_head | $raw %]

View File

@ -7,7 +7,7 @@
[%- IF ( starting_location ) %]<span>Shelving location:</span> [%- starting_location | html -%][% END -%]
[%- IF ( starting_homebranch && starting_ccode ) %],[% END %]
[%- IF ( starting_ccode ) %]<span>Collection: [%- starting_ccode | html -%]</span>[% END -%]
<a style="font-size: 75%;" href="/cgi-bin/koha/opac-detail.pl?biblionumber=[% biblionumber | html %]" class="close_shelf">Close shelf browser <span class="sr-only">(Hides shelf browser)</span></a>
<a style="font-size: 75%;" href="/cgi-bin/koha/opac-detail.pl?biblionumber=[% biblionumber | html %]" class="close_shelf">Close shelf browser <span class="visually-hidden">(Hides shelf browser)</span></a>
</h2>
<table class="table" role="presentation ">

View File

@ -174,7 +174,7 @@
<fieldset>
<legend>Picture</legend>
<label for="graphics-type" class="sr-only">Graphics type</label>
<label for="graphics-type" class="visually-hidden">Graphics type</label>
<select id="graphics-type" name="limit" class="subtype">
<option value="">Any</option>
<option value="Graphics-type:a">collage</option>
@ -188,7 +188,7 @@
<option value="Graphics-type:k">technical drawing</option>
<option value="Graphics-type:z">other non-projected graphic type</option>
</select>
<label for="graphics-support" class="sr-only">Graphics support</label>
<label for="graphics-support" class="visually-hidden">Graphics support</label>
<select id="graphics-support" name="limit" class="subtype">
<option value="">Any</option>
<option value="Graphics-support:a">canvas</option>

View File

@ -16,7 +16,7 @@
</div>
</div>
<label class="sr-only" for="star_rating-[% item.itemnumber | html %]">star rating</label>
<label class="visually-hidden" for="star_rating-[% item.itemnumber | html %]">star rating</label>
<select class="star_rating" id="star_rating-[% item.itemnumber | html %]" name="rating" autocomplete="off" data-biblionumber="[% item.biblionumber | html %]" data-context="rating-[% item.itemnumber | html %]">
[% IF ( rating_avg_int == 0 ) %]
<option value="" selected="selected"></option>

View File

@ -6,7 +6,7 @@
<h2>Clubs currently enrolled in</h2>
<table id="clubs-table-enrolled" class="table table-bordered table-striped">
<caption class="sr-only">Clubs</caption>
<caption class="visually-hidden">Clubs</caption>
<thead>
<tr>
<th class="all">Name</th>

View File

@ -6,7 +6,7 @@
<div class="container-fluid">
<form method="get" id="patron-enrollment-form">
<legend class="sr-only">Enrollment</legend>
<legend class="visually-hidden">Enrollment</legend>
<input type="hidden" name="id" value="[% club.id | html %]" />
<input type="hidden" name="borrowernumber" value="[% borrowernumber | html %]" />
<fieldset class="rows">

View File

@ -48,7 +48,7 @@
<div id="labeledmarc">
<table id="marc" class="table table-bordered table-striped">
<caption class="sr-only">MARC details</caption>
<caption class="visually-hidden">MARC details</caption>
[% FOREACH tab0X IN tab0XX %]
<tr><th colspan="2">[% tab0X.tag | html %]</th></tr>
[% FOREACH subfiel IN tab0X.subfield %]

View File

@ -63,7 +63,7 @@
[% IF ( total ) %]
<div class="searchresults">
<table class="table table-bordered table-striped">
<caption class="sr-only">Authority search results</caption>
<caption class="visually-hidden">Authority search results</caption>
<thead>
<tr>
<th>Authorized headings</th>

View File

@ -138,7 +138,7 @@
[% ELSE %]
[% check_title = BIBLIO_RESULT.biblionumber %]
[% END %]
<label for="bib[% BIBLIO_RESULT.biblionumber | html %]" class="sr-only">[% check_title | html %]</label>
<label for="bib[% BIBLIO_RESULT.biblionumber | html %]" class="visually-hidden">[% check_title | html %]</label>
<h2>
<input type="checkbox" class="cb" value="[% BIBLIO_RESULT.biblionumber | html %]" name="bib[% BIBLIO_RESULT.biblionumber | html %]" id="bib[% BIBLIO_RESULT.biblionumber | html %]" />
[% INCLUDE 'biblio-title.inc' biblio=BIBLIO_RESULT %]
@ -338,7 +338,7 @@
[% ELSE %]
<form action="/cgi-bin/koha/opac-basket.pl" method="get" name="bookbag_form" id="bookbag_form">
<table id="itemst" class="table table-bordered table-striped">
<caption class="sr-only">Items in your cart</caption>
<caption class="visually-hidden">Items in your cart</caption>
<thead>
<tr>
<th class="noprint no-sort">&nbsp;</th>
@ -357,7 +357,7 @@
[% ELSE %]
[% check_title = BIBLIO_RESULT.biblionumber %]
[% END %]
<label for="bib[% BIBLIO_RESULT.biblionumber | html %]" class="sr-only">[% check_title | html %]</label>
<label for="bib[% BIBLIO_RESULT.biblionumber | html %]" class="visually-hidden">[% check_title | html %]</label>
<input type="checkbox" class="cb" value="[% BIBLIO_RESULT.biblionumber | html %]" name="bib[% BIBLIO_RESULT.biblionumber | html %]" id="bib[% BIBLIO_RESULT.biblionumber | html %]" />
</td>
<td>

View File

@ -43,7 +43,7 @@
<h1>Browse search</h1>
<form method="get">
<legend class="sr-only">Browse search</legend>
<legend class="visually-hidden">Browse search</legend>
<div class="form-row">
<div class="col">
<label for="browse-searchterm">Search for:</label>

View File

@ -58,7 +58,7 @@
[% END %]
<li style="list-style-type: none;">
<table class="table table-bordered table-striped">
<caption class="sr-only">Items in catalog</caption>
<caption class="visually-hidden">Items in catalog</caption>
<tr>
[% FOREACH LEVEL_LOO IN LEVEL_LOOP %]
<td>

View File

@ -62,7 +62,7 @@
[% IF ( course_reserves ) %]
<div class="rows">
<table id="course-items-table" class="table table-bordered table-striped table-condensed">
<caption class="sr-only">Courses</caption>
<caption class="visually-hidden">Courses</caption>
<thead>
<tr>
<th class="anti-the">Title</th>

View File

@ -35,7 +35,7 @@
<h1>Course reserves</h1>
<table id="course_reserves_table" class="table table-bordered table-striped table-condensed">
<caption class="sr-only">Courses</caption>
<caption class="visually-hidden">Courses</caption>
<thead>
<tr>
<th>Name</th>

View File

@ -260,7 +260,7 @@
[% IF ( loggedinusername ) %]
<form id="tagform[% biblio.biblionumber | html %]" method="post" action="/cgi-bin/koha/opac-tags.pl" style="display:none;">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Tags</legend>
<legend class="visually-hidden">Tags</legend>
<div class="form-row">
<div class="col-3">
<label for="newtag[% biblio.biblionumber | html %]">New tag(s), separated by a comma:</label>
@ -340,7 +340,7 @@
[% IF ( OpacStarRatings != 'disable' ) %]
<form method="post" action="/cgi-bin/koha/opac-ratings.pl">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Star ratings</legend>
<legend class="visually-hidden">Star ratings</legend>
<div class="results_summary ratings" id="rating-[% biblio.biblionumber | html %]">
[% SET rating_avg = ratings.get_avg_rating() %]
[% rating_avg_int = BLOCK %][% rating_avg | format("%.0f") %][% END %]
@ -549,7 +549,7 @@
[% IF ( serialcollection ) %]
[% WRAPPER tab_panel tabname="serialcollection" %]
<table id="serialcollectiont" class="table table-bordered table-striped">
<caption class="sr-only">Serial collections</caption>
<caption class="visually-hidden">Serial collections</caption>
<thead>
<tr>
<th id="serial_library">Library</th>
@ -794,7 +794,7 @@
[% IF ( subscription.latestserials ) %]
<p class="subscription_latestissues"> The [% subscription.opacdisplaycount | html %] latest issues for this subscription:</p>
<table class="table table-bordered table-striped subscriptionst">
<caption class="sr-only">Latest serials</caption>
<caption class="visually-hidden">Latest serials</caption>
<thead>
<tr>
<th id="serial_serialseq" data-colname="serial_serialseq">Issue #</th>
@ -920,7 +920,7 @@
[% WRAPPER tab_panel tabname="editions" %]
<h2>Other editions of this work</h2>
<table class="table table-bordered table-striped">
<caption class="sr-only">Other editions</caption>
<caption class="visually-hidden">Other editions</caption>
[% FOREACH XISBN IN XISBNS %]
<tr>
<td>
@ -1271,7 +1271,7 @@
[% BLOCK items_table %]
[% SET hidden_columns_force.$table_id = [] %]
<table class="table table-bordered table-striped" id="[% table_id | html %]">
<caption class="sr-only">Holdings</caption>
<caption class="visually-hidden">Holdings</caption>
<thead>
<tr>
<th id="item_cover" data-colname="item_cover">Cover image</th>
@ -1407,13 +1407,13 @@
class="close_shelf"
href="/cgi-bin/koha/opac-detail.pl?biblionumber=[% ITEM_RESULT.biblionumber | html %]&amp;shelfbrowse_itemnumber=[% ITEM_RESULT.itemnumber | html %]#[% tab | html %]"
aria-label="Browse the shelf for items near [% title | html %]"
>Browse shelf<span class="sr-only">(Opens below)</span></a
>Browse shelf<span class="visually-hidden">(Opens below)</span></a
>)
[% ELSE %]
(<a
href="/cgi-bin/koha/opac-detail.pl?biblionumber=[% ITEM_RESULT.biblionumber | uri %]&amp;shelfbrowse_itemnumber=[% ITEM_RESULT.itemnumber | uri %]#[% tab | uri %]"
aria-label="Browse the shelf for items near [% title | html %]"
>Browse shelf<span class="sr-only">(Opens below)</span></a
>Browse shelf<span class="visually-hidden">(Opens below)</span></a
>)
[% END %]
[% END %]

View File

@ -76,7 +76,7 @@
</fieldset>
<fieldset class="action">
<legend class="sr-only">Choose action</legend>
<legend class="visually-hidden">Choose action</legend>
<input type="hidden" name="shelfnumber" value="[% shelf.shelfnumber | html %]" />
<input type="submit" name="save" class="btn btn-primary" value="Go" />
<a href="/cgi-bin/koha/opac-shelves.pl?op=view&amp;shelfnumber=[% shelf.shelfnumber | uri %]" class="cancel close" data-bs-dismiss="modal">Cancel</a>

View File

@ -131,7 +131,7 @@
[% END %]
<div class="yeardata tabsub" id="show[% year.year | html %]" style="[% div_style | html %]">
<table class="subscriptionstclass table table-bordered table-striped">
<caption class="sr-only">Subscriptions</caption>
<caption class="visually-hidden">Subscriptions</caption>
<thead>
<tr>
<th>Date</th>

View File

@ -94,7 +94,7 @@
[% END %]
</div>
<table id="table_holdshistory" class="table table-bordered table-striped">
<caption class="sr-only">Holds history</caption>
<caption class="visually-hidden">Holds history</caption>
<thead>
<tr>
<th class="anti-the">Title</th>

View File

@ -32,7 +32,7 @@
<h1 class="role" title="Click to expand this role">[% role.role_name | html %] ([% role.count | html %])</h1>
<div class="docs">
<table>
<caption class="sr-only">[% role.role_name | html %]</caption>
<caption class="visually-hidden">[% role.role_name | html %]</caption>
<thead>
<tr>
<th>Citation</th>

View File

@ -102,7 +102,7 @@
[% INCLUDE messages %]
[% IF backends %]
<form method="get" id="illrequestcreate-form" novalidate="novalidate">
<legend class="sr-only">Backends</legend>
<legend class="visually-hidden">Backends</legend>
<fieldset class="rows">
<label for="backend">Provider:</label>
<select name="backend">
@ -146,7 +146,7 @@
[% END %]
<table id="illrequestlist" class="table table-bordered table-striped">
<caption class="sr-only">Requests</caption>
<caption class="visually-hidden">Requests</caption>
<thead>
<tr>
<th>Request ID</th>

View File

@ -50,7 +50,7 @@
[% ELSE %]
<form id="issue-note" action="/cgi-bin/koha/opac-issue-note.pl" method="post">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Edit checkout note</legend>
<legend class="visually-hidden">Edit checkout note</legend>
<fieldset>
<label for="note" class="required">Note:</label>
<input type="text" name="note" value="[% note | html %]" />

View File

@ -62,12 +62,12 @@
[% column_class = "col-12 col-lg-10 order-md-1 maincontent" %]
[% END %]
<div class="[% column_class | html %]">
<h1 class="sr-only">Koha home</h1>
<h1 class="visually-hidden">Koha home</h1>
[% IF Koha.Preference( 'OpacNewsLibrarySelect' ) && AllPublicBranches.size > 1 %]
[% UNLESS news_id %]
<form id="news-branch-select" class="form-inline" name="news-branch-select" method="get" action="/cgi-bin/koha/opac-main.pl">
<legend class="sr-only">News</legend>
<legend class="visually-hidden">News</legend>
<label for="news-branch">Display news for: </label>
<select id="news-branch" name="branch">
[% IF ( branchcode == "" ) %]
@ -172,7 +172,7 @@
<form action="/cgi-bin/koha/opac-user.pl" method="post" name="auth" id="auth" autocomplete="off">
[% INCLUDE 'csrf-token.inc' %]
<input type="hidden" name="koha_login_context" value="opac" />
<h2 class="sr-only">Login form</h2>
<h2 class="visually-hidden">Login form</h2>
<fieldset class="brief">
<legend>Log in to your account:</legend>
[% IF ( Koha.Preference('GoogleOpenIDConnect') == 1 ) %]

View File

@ -180,7 +180,7 @@
[% IF has_guarantor_flag && !Koha.Preference('OPACPrivacy') && ( Koha.Preference('AllowPatronToSetCheckoutsVisibilityForGuarantor') || Koha.Preference('AllowPatronToSetFinesVisibilityForGuarantor') ) %]
<div class="row">
<div class="col">
<h2 class="sr-only">Privacy</h2>
<h2 class="visually-hidden">Privacy</h2>
<fieldset class="rows" id="memberentry_privacy">
<legend id="privacy_legend">Privacy</legend>
<ol>
@ -261,7 +261,7 @@
[% UNLESS ( hidden.defined('cardnumber') || ( !borrower && Koha.Preference('autoMemberNum') ) ) && hidden.defined('dateexpiry') && hidden.defined('branchcode') && hidden.defined('categorycode') %]
<div class="row">
<div class="col">
<h2 class="sr-only">Library</h2>
<h2 class="visually-hidden">Library</h2>
<fieldset class="rows" id="memberentry_library">
<legend id="library_legend">Library</legend>
<ol>
@ -407,7 +407,7 @@
[% UNLESS hidden.defined('title') && hidden.defined('surname') && hidden.defined('firstname') && hidden.defined('preferred_name') && hidden.defined('middle_name') && hidden.defined('dateofbirth') && hidden.defined('initials') && hidden.defined('pronouns') && hidden.defined('othernames') && hidden.defined('sex') %]
<div class="row">
<div class="col">
<h2 class="sr-only">Identity</h2>
<h2 class="visually-hidden">Identity</h2>
<fieldset class="rows" id="memberentry_identity">
<legend id="identity_legend">Identity</legend>
@ -604,7 +604,7 @@
[% UNLESS hidden.defined('streetnumber') && hidden.defined('address') && hidden.defined('address2') && hidden.defined('city') && hidden.defined('state') && hidden.defined('zipcode') && hidden.defined('country') %]
<div class="row">
<div class="col">
<h2 class="sr-only">Main address</h2>
<h2 class="visually-hidden">Main address</h2>
<fieldset class="rows" id="memberentry_mainaddress">
<legend id="mainaddress_legend">Main address</legend>
@ -706,7 +706,7 @@
[% UNLESS hidden.defined('phone') && hidden.defined('phonepro') && hidden.defined('mobile') && hidden.defined('email') && hidden.defined('emailpro') && hidden.defined('fax') %]
<div class="row">
<div class="col">
<h2 class="sr-only">Contact information</h2>
<h2 class="visually-hidden">Contact information</h2>
<fieldset class="rows" id="memberentry_contact">
<legend id="contact_legend">Contact information</legend>
@ -893,7 +893,7 @@
[% UNLESS hidden.defined('B_streetnumber') && hidden.defined('B_address') && hidden.defined('B_address2') && hidden.defined('B_city') && hidden.defined('B_state') && hidden.defined('B_zipcode') && hidden.defined('B_country') && hidden.defined('B_phone') && hidden.defined('B_email') && hidden.defined('contactnote') %]
<div class="row">
<div class="col">
<h2 class="sr-only">Alternate address</h2>
<h2 class="visually-hidden">Alternate address</h2>
<fieldset class="rows" id="memberentry_alternateaddress">
<legend id="alternateaddress_legend">Alternate address</legend>
@ -1042,7 +1042,7 @@
[% UNLESS hidden.defined('altcontactsurname') && hidden.defined('altcontactfirstname') && hidden.defined('altcontactaddress1') && hidden.defined('altcontactaddress2') && hidden.defined('altcontactaddress3') && hidden.defined('altcontactstate') && hidden.defined('altcontactzipcode') && hidden.defined('altcontactcountry') && hidden.defined('altcontactphone') %]
<div class="row">
<div class="col">
<h2 class="sr-only">Alternate contact</h2>
<h2 class="visually-hidden">Alternate contact</h2>
<fieldset class="rows" id="memberentry_alternatecontact">
<legend id="alternatecontact_legend">Alternate contact</legend>
@ -1201,7 +1201,7 @@
[% UNLESS op == 'edit' || hidden.defined('password') %]
<div class="row">
<div class="col">
<h2 class="sr-only">Password</h2>
<h2 class="visually-hidden">Password</h2>
<fieldset class="rows" id="memberentry_password">
<legend id="contact_legend">Password</legend>
<div class="alert alert-info">
@ -1318,7 +1318,7 @@
[% IF Koha.Preference('PrivacyPolicyConsent') && op != 'edit' %]
<div class="row">
<div class="col">
<h2 class="sr-only">Data privacy policy consent</h2>
<h2 class="visually-hidden">Data privacy policy consent</h2>
<fieldset class="rows" id="memberentry_gdpr_consent">
<legend>Data privacy policy consent</legend>
<ol>
@ -1342,7 +1342,7 @@
[% UNLESS op == 'edit' %]
<div class="row">
<div class="col">
<h2 class="sr-only">Verification</h2>
<h2 class="visually-hidden">Verification</h2>
<fieldset class="rows" id="memberentry_captcha">
<legend>Verification</legend>
<ol>

View File

@ -49,7 +49,7 @@
[% IF Koha.Preference( 'EnhancedMessagingPreferencesOPAC' ) %]
<table class="table table-bordered table-condensed table-striped">
<caption class="sr-only">Your messaging settings</caption>
<caption class="visually-hidden">Your messaging settings</caption>
<thead>
<tr>
<th>&nbsp;</th>

View File

@ -76,7 +76,7 @@
[% IF ( Ask_data ) %]
<form action="/cgi-bin/koha/opac-passwd.pl" name="mainform" id="mainform" method="post">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Change your password</legend>
<legend class="visually-hidden">Change your password</legend>
<fieldset>
[% IF ( logged_in_user.category.effective_require_strong_password ) %]
<div class="alert alert-info">Your password must contain at least [% logged_in_user.category.effective_min_password_length | html %] characters, including UPPERCASE, lowercase and numbers.</div>

View File

@ -133,7 +133,7 @@
[% ELSIF (password_recovery) %]
<form action="/cgi-bin/koha/opac-password-recovery.pl" method="post" autocomplete="off">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Password recovery</legend>
<legend class="visually-hidden">Password recovery</legend>
<input type="hidden" name="koha_login_context" value="opac" />
<p>To reset your password, enter your login or your email address.</p>
<fieldset class="brief">
@ -158,7 +158,7 @@
<form id="mainform" name="mainform" action="/cgi-bin/koha/opac-password-recovery.pl" method="post" autocomplete="off">
[% INCLUDE 'csrf-token.inc' %]
<input type="hidden" name="op" value="cud-reset_password" />
<legend class="sr-only">Password not valid</legend>
<legend class="visually-hidden">Password not valid</legend>
<input type="hidden" name="koha_login_context" value="opac" />
<fieldset class="brief">
[% IF ( RequireStrongPassword ) %]

View File

@ -78,7 +78,7 @@
<p id="note2">Please also note that the library staff can't update these values for you: it's your privacy!</p>
<form action="/cgi-bin/koha/opac-privacy.pl" method="post" id="opac-privacy-update-form">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Privacy rule</legend>
<legend class="visually-hidden">Privacy rule</legend>
<input type="hidden" name="op" value="cud-update_privacy" />
<fieldset>
<label for="privacy">Please choose your privacy rule:</label>

View File

@ -114,7 +114,7 @@
[% BLOCK checkout_history_table %]
<table id="readingrec" class="table table-bordered table-striped">
<caption class="sr-only">Checkout history</caption>
<caption class="visually-hidden">Checkout history</caption>
<thead>
<tr>
<th style="display:none;" class="no-export">Type</th>

View File

@ -71,7 +71,7 @@
<div id="reportproblem" class="maincontent toptabs">
<form name="reportlibform" action="/cgi-bin/koha/opac-reportproblem.pl" method="post">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Report a problem</legend>
<legend class="visually-hidden">Report a problem</legend>
<input type="hidden" name="op" value="cud-addreport" />
<fieldset class="rows">
<ol>

View File

@ -69,7 +69,7 @@
<form id="place-article-request" method="post" action="/cgi-bin/koha/opac-request-article.pl">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Place article request</legend>
<legend class="visually-hidden">Place article request</legend>
<input type="hidden" name="op" value="cud-create" />
<input type="hidden" name="biblionumber" id="biblionumber" value="[% biblio.biblionumber | html %]" />

View File

@ -115,7 +115,7 @@
<form action="/cgi-bin/koha/opac-reserve.pl" method="post" id="hold-request-form">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Hold requests</legend>
<legend class="visually-hidden">Hold requests</legend>
<input type="hidden" name="op" value="cud-place_reserve" />
[% IF ( Koha.Preference('DisplayAddHoldGroups') && ( multi_hold || Koha.Preference('DisplayMultiItemHolds') ) ) %]
<div id="hold_group">

View File

@ -80,7 +80,7 @@
[% ELSE %]
<form action="/cgi-bin/koha/opac-reset-password.pl" name="mainform" id="mainform" method="post" autocomplete="off">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Reset your password</legend>
<legend class="visually-hidden">Reset your password</legend>
<fieldset class="brief">
<div class="form-group">

View File

@ -182,7 +182,7 @@
[% IF ( total ) %]
<div class="searchresults">
<form action="/cgi-bin/koha/opac-search.pl" method="get" name="bookbag_form" id="bookbag_form">
<legend class="sr-only">Sort</legend>
<legend class="visually-hidden">Sort</legend>
[% IF ( searchdesc ) %]
[% FOREACH QUERY_INPUT IN QUERY_INPUTS %]
<input type="hidden" name="[% QUERY_INPUT.input_name | html %]" value="[% QUERY_INPUT.input_value | html %]" />
@ -198,7 +198,7 @@
[% UNLESS tag %]
<div class="sort_by col-sm-auto">
<label for="sort_by">Sort results by:</label>
<label for="sort_by" class="sr-only">Sort by:</label>
<label for="sort_by" class="visually-hidden">Sort by:</label>
<select id="sort_by" class="resort form-select form-select-sm" name="sort_by">
[% INCLUDE 'resort_form.inc' %]
</select>
@ -236,7 +236,7 @@
<!-- TABLE RESULTS START -->
<table class="table table-striped" role="presentation">
<span class="sr-only">Results</span>
<span class="visually-hidden">Results</span>
<!-- Actual Search Results -->
[% FOREACH SEARCH_RESULT IN SEARCH_RESULTS %]
@ -390,7 +390,7 @@
[% INCLUDE "openlibrary-readapi.inc" bib = SEARCH_RESULT %]
[% IF ( OpacStarRatings == 'all' ) %]
<span class="sr-only"> star rating </span>
<span class="visually-hidden"> star rating </span>
<div class="results_summary ratings">
[% SET rating_avg = SEARCH_RESULT.ratings.get_avg_rating() %]
[% rating_avg_int = BLOCK %][% rating_avg | format("%.0f") %][% END %]
@ -407,7 +407,7 @@
[% END %]
</div>
</div>
<span class="sr-only"> Average : [% rating_avg | html %] out of 5 stars</span>
<span class="visually-hidden"> Average : [% rating_avg | html %] out of 5 stars</span>
[% IF SEARCH_RESULT.ratings.count > 0 %]
<span id="rating_total_[% SEARCH_RESULT.biblionumber | html %]">&nbsp;&nbsp;([% SEARCH_RESULT.ratings.count | html %] votes)</span>
[% ELSE %]

View File

@ -59,7 +59,7 @@
[% IF ( biblio.author ) %]<h3>[% biblio.author | html %]</h3>[% END %]
<form id="reviewf" action="/cgi-bin/koha/opac-review.pl" method="post">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Comments</legend>
<legend class="visually-hidden">Comments</legend>
<input type="hidden" name="biblionumber" value="[% biblio.biblionumber | html %]" />
[% IF ( reviewid ) %]
<input type="hidden" name="reviewid" value="[% reviewid | html %]" />

View File

@ -46,7 +46,7 @@
<p id="routing-list-intro">You are subscribed to the routing lists for following serial titles. If you wish to make changes, please contact the library.</p>
<table class="table table-bordered table-striped" id="routingtable">
<caption class="sr-only">Routing lists</caption>
<caption class="visually-hidden">Routing lists</caption>
<thead>
<tr>
<th>Subscription title</th>

View File

@ -90,12 +90,12 @@
<h2>Current session</h2>
<form action="/cgi-bin/koha/opac-search-history.pl" method="post">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Toolbar control</legend>
<legend class="visually-hidden">Toolbar control</legend>
[% INCLUDE 'toolbar_controls' %]
<input type="hidden" name="op" value="cud-delete" />
<table class="historyt table table-bordered table-striped">
<caption class="sr-only">Current session</caption>
<caption class="visually-hidden">Current session</caption>
<thead>
<tr>
<th class="no-sort">
@ -143,12 +143,12 @@
<h2>Previous sessions</h2>
<form action="/cgi-bin/koha/opac-search-history.pl" method="post">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Toolbar control</legend>
<legend class="visually-hidden">Toolbar control</legend>
[% INCLUDE 'toolbar_controls' %]
<input type="hidden" name="op" value="cud-delete" />
<table class="historyt table table-bordered table-striped">
<caption class="sr-only">Previous sessions</caption>
<caption class="visually-hidden">Previous sessions</caption>
<thead>
<tr>
<th class="no-sort">
@ -202,11 +202,11 @@
<h2>Current session</h2>
<form action="/cgi-bin/koha/opac-search-history.pl" method="post">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Toolbar control</legend>
<legend class="visually-hidden">Toolbar control</legend>
[% INCLUDE 'toolbar_controls' %]
<input type="hidden" name="op" value="cud-delete" />
<table class="historyt table table-bordered table-striped">
<caption class="sr-only">Current session</caption>
<caption class="visually-hidden">Current session</caption>
<thead>
<tr>
<th class="no-sort">
@ -245,11 +245,11 @@
<h2>Previous sessions</h2>
<form action="/cgi-bin/koha/opac-search-history.pl" method="post">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Toolbar control</legend>
<legend class="visually-hidden">Toolbar control</legend>
[% INCLUDE 'toolbar_controls' %]
<input type="hidden" name="op" value="cud-delete" />
<table class="historyt table table-bordered table-striped">
<caption class="sr-only">Previous sessions</caption>
<caption class="visually-hidden">Previous sessions</caption>
<thead>
<tr>
<th class="no-sort">

View File

@ -58,7 +58,7 @@
[% ELSE %]
<form action="/cgi-bin/koha/opac-sendbasket.pl" method="post" id="sendbasketform">
<fieldset class="brief">
<legend class="sr-only">Message details</legend>
<legend class="visually-hidden">Message details</legend>
<label for="email_add">Email address:</label>
<input type="text" id="email_add" name="email_add" size="43" class="focus form-control" />
<label for="comment">Comment:</label>

View File

@ -72,7 +72,7 @@
<form action="/cgi-bin/koha/opac-sendshelf.pl" method="post" id="sendshelfform">
[% INCLUDE 'csrf-token.inc' %]
<fieldset class="brief">
<legend class="sr-only">Message details</legend>
<legend class="visually-hidden">Message details</legend>
<label for="email">Email address:</label>
<input type="text" id="email" name="email" size="43" class="focus form-control" />

View File

@ -88,7 +88,7 @@
<div id="invite">
<form method="post" id="share_list">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Share list</legend>
<legend class="visually-hidden">Share list</legend>
<fieldset class="rows">
<input type="hidden" name="op" value="cud-invite" />
<input type="hidden" name="shelfnumber" value="[% shelfnumber | html %]" />
@ -125,7 +125,7 @@
<div id="accept">
<form method="post" id="accept_share">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Accept shared list</legend>
<legend class="visually-hidden">Accept shared list</legend>
<p>One of our patrons invited you to share their list [% shelfname | html %].</p>
<input type="hidden" name="op" value="cud-accept" />
<input type="hidden" name="shelfnumber" value="[% shelfnumber | html %]" />

View File

@ -724,9 +724,9 @@
</div>
<table class="table">
[% IF !public %]
<caption class="sr-only">Your lists</caption>
<caption class="visually-hidden">Your lists</caption>
[% ELSIF public %]
<caption class="sr-only">Public lists</caption>
<caption class="visually-hidden">Public lists</caption>
[% END %]
<thead>
<tr>

View File

@ -51,7 +51,7 @@
><i class="fa fa-rss rsssearchicon" aria-hidden="true" title="Subscribe to recent comments"></i></a
></h1>
<table class="table table-striped">
<caption class="sr-only">Comments</caption>
<caption class="visually-hidden">Comments</caption>
[% FOREACH review IN reviews %]
<tr>
<td>

View File

@ -369,7 +369,7 @@
[% IF Koha.Preference( 'OPACViewOthersSuggestions' ) %]
[% IF loggedinusername %]
<div class="col-auto gx-2 my-1">
<label class="sr-only" for="suggested_by_anyone">Suggested by:</label>
<label class="visually-hidden" for="suggested_by_anyone">Suggested by:</label>
<select class="form-select form-select-sm" name="suggested_by_anyone" id="suggested_by_anyone">
[% IF suggested_by_anyone %]
<option value="0">Suggested by me</option>
@ -419,7 +419,7 @@
[% IF Koha.Preference( 'OPACViewOthersSuggestions' ) == 1 || loggedinusername %]
<table id="suggestt" class="table table-bordered tabled">
<caption class="sr-only">Your purchase suggestions</caption>
<caption class="visually-hidden">Your purchase suggestions</caption>
<thead>
<tr>
[% IF ( loggedinusername ) %]

View File

@ -235,7 +235,7 @@
[% IF Koha.Preference('AllowPatronToControlAutorenewal') %]
<form id="autorenewal_option" action="/cgi-bin/koha/opac-user.pl" method="post">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Auto-renewal</legend>
<legend class="visually-hidden">Auto-renewal</legend>
<label for="yes-autorenew_checkouts"> Allow auto-renewal: </label>
[% IF ( borrower.autorenew_checkouts ) %]
<label class="radio inline" for="yes-autorenew_checkouts">
@ -332,7 +332,7 @@
[% IF ( issues_count ) %]
<form id="renewselected" action="/cgi-bin/koha/opac-renew.pl" method="post">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Renew selected</legend>
<legend class="visually-hidden">Renew selected</legend>
<input type="hidden" name="borrowernumber" value="[% borrowernumber | html %]" />
<input type="hidden" name="from" value="opac_user" />
<table id="checkoutst" class="table table-bordered table-striped">
@ -558,7 +558,7 @@
[% IF ( canrenew && !userdebarred && OpacRenewalAllowed && !( logged_in_user.is_expired && logged_in_user.category.effective_BlockExpiredPatronOpacActions_contains('renew') ) ) %]
<form id="renewall" class="js-hide" action="/cgi-bin/koha/opac-renew.pl" method="post">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Renew</legend>
<legend class="visually-hidden">Renew</legend>
<input type="hidden" name="from" value="opac_user" />
<input type="hidden" name="op" value="cud-renew" />
<input type="hidden" name="borrowernumber" value="[% borrowernumber | html %]" />
@ -572,7 +572,7 @@
[% END %]
[% ELSE %]
<table class="table table-bordered table-striped">
<caption class="sr-only">Checked out</caption>
<caption class="visually-hidden">Checked out</caption>
<tr><td>You have nothing checked out</td></tr>
</table>
[% END # IF issues_count %]
@ -668,7 +668,7 @@
[% IF relatives %]
[% WRAPPER tab_panel tabname="opac-user-relative-issues" %]
<table id="opac-user-relative-issues-table" class="table table-bordered table-striped">
<caption class="sr-only">Relatives' checkouts</caption>
<caption class="visually-hidden">Relatives' checkouts</caption>
<thead>
<tr>
<th class="all anti-the">Title</th>
@ -995,7 +995,7 @@
</table>
[% ELSE %]
<table class="table table-bordered table-striped">
<caption class="sr-only">Article requests</caption>
<caption class="visually-hidden">Article requests</caption>
<tr><td>You have no article requests currently.</td></tr>
</table>
[% END # IF current_article_requests.size %]

View File

@ -144,7 +144,7 @@
<div id="new_checkins" class="sci_entry">
<form id="scan_form" name="scan_form" method="post" action="/cgi-bin/koha/sci/sci-main.pl">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Scan</legend>
<legend class="visually-hidden">Scan</legend>
<div class="row mb-1">
<div class="col">
<label for="barcode_input">Scan the item or enter its barcode:</label>
@ -165,7 +165,7 @@
<div class="col">
<div class="sci_input_append">
<table id="sci_barcodes_table" class="table table-bordered table-striped dataTable no-footer" style="display: none;">
<caption class="sr-only">Barcodes</caption>
<caption class="visually-hidden">Barcodes</caption>
<thead>
<th class="barcodes_column">Barcode</th>
</thead>

View File

@ -224,7 +224,7 @@
<td>
<form action="/cgi-bin/koha/sco/sco-main.pl" method="post">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Issue renews</legend>
<legend class="visually-hidden">Issue renews</legend>
<input type="hidden" name="patronid" value="[% patronid | html %]" />
<input type="hidden" name="load_checkouts" value="[% load_checkouts | html %]" />
<input type="hidden" name="barcode" value="[% ISSUE.barcode | html %]" />
@ -257,7 +257,7 @@
<td>
<form action="/cgi-bin/koha/sco/sco-main.pl" method="post">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Issue renews</legend>
<legend class="visually-hidden">Issue renews</legend>
<input type="hidden" name="patronid" value="[% patronid | html %]" />
<input type="hidden" name="load_checkouts" value="[% load_checkouts | html %]" />
<input type="hidden" name="barcode" value="[% ISSUE.barcode | html %]" />
@ -615,7 +615,7 @@
[% IF ( item.returnitem && Koha.Preference('SCOAllowCheckin') ) %]
<form action="/cgi-bin/koha/sco/sco-main.pl" name="errorForm" class="inline" method="post">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Return</legend>
<legend class="visually-hidden">Return</legend>
<input type="hidden" name="op" value="cud-returnbook" />
<input type="hidden" name="patronid" value="[% patronid | html %]" />
<input type="hidden" name="barcode" value="[% item.barcode | html %]" />
@ -626,7 +626,7 @@
[% END %]
<form action="/cgi-bin/koha/sco/sco-main.pl" name="errorForm" class="inline" method="get">
<legend class="sr-only">Error</legend>
<legend class="visually-hidden">Error</legend>
<input type="hidden" name="op" value="" />
<input type="hidden" name="patronid" value="[% patronid | html %]" />
<input type="hidden" name="barcode" value="[% item.barcode | html %]" />
@ -650,7 +650,7 @@
[% IF ( c.renew && Koha.Preference('SCOAllowCheckin') ) %]
<form action="/cgi-bin/koha/sco/sco-main.pl" name="confirmForm" class="inline" method="post">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Return</legend>
<legend class="visually-hidden">Return</legend>
<input type="hidden" name="op" value="cud-returnbook" />
<input type="hidden" name="patronid" value="[% patronid | html %]" />
<input type="hidden" name="barcode" value="[% c.barcode | html %]" />
@ -664,7 +664,7 @@
[% UNLESS ( c.renew ) %]
<form action="/cgi-bin/koha/sco/sco-main.pl" name="confirmForm" class="inline" method="post">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Renew</legend>
<legend class="visually-hidden">Renew</legend>
<input type="hidden" name="op" value="cud-renew" />
<input type="hidden" name="patronid" value="[% patronid | html %]" />
<input type="hidden" name="barcode" value="[% c.barcode | html %]" />
@ -676,7 +676,7 @@
[% ELSE %]
<form action="/cgi-bin/koha/sco/sco-main.pl" name="confirmForm" class="inline" method="post">
[% INCLUDE 'csrf-token.inc' %]
<legend class="sr-only">Renew</legend>
<legend class="visually-hidden">Renew</legend>
<input type="hidden" name="op" value="cud-renew" />
<input type="hidden" name="patronid" value="[% patronid | html %]" />
<input type="hidden" name="barcode" value="[% c.barcode | html %]" />
@ -688,7 +688,7 @@
[% END %]
<form action="/cgi-bin/koha/sco/sco-main.pl" name="confirmForm" class="inline" method="get">
<legend class="sr-only">Cancel</legend>
<legend class="visually-hidden">Cancel</legend>
<input type="hidden" name="op" value="" />
<input type="hidden" name="patronid" value="[% patronid | html %]" />
<input type="hidden" name="load_checkouts" value="[% load_checkouts | html %]" />

View File

@ -72,7 +72,7 @@ $(document).ready(function () {
var data_rating = $(this).attr("data-rating-value");
if (data_rating) {
$(this).append(
'<span class="sr-only">' + data_rating + "</span>"
'<span class="visually-hidden">' + data_rating + "</span>"
);
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,6 +0,0 @@
/*!
* Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2023 Fonticons, Inc.
*/
:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}

View File

@ -11,6 +11,7 @@
"@cypress/webpack-dev-server": "^1.8.3",
"@cypress/webpack-preprocessor": "^6.0.4",
"@faker-js/faker": "^9.2.0",
"@fortawesome/fontawesome-free": "^7.2.0",
"@fortawesome/fontawesome-svg-core": "^6.1.0",
"@fortawesome/free-solid-svg-icons": "^6.0.0",
"@fortawesome/vue-fontawesome": "^3.0.0-5",