From 052c0faf487d824555ad76ae040e46e5fd337efa Mon Sep 17 00:00:00 2001
From: Aspectis <tobias@aspectis.net>
Date: Thu, 27 May 2021 13:34:53 +0200
Subject: [PATCH] refs #18965 [fid_bbi] massive theme refactoring

* for details see issue/18965

co-authored by: Dorian Merz <merz@ub.uni-leipzig.de>
---
 themes/fid_bbi/dummy-posts.json               |  22 --
 themes/fid_bbi/js/theme.js                    |  14 +-
 themes/fid_bbi/scss/base/common.scss          |  28 ++-
 themes/fid_bbi/scss/base/form.scss            |  11 +-
 .../fid_bbi/scss/blocks/advanced-search.scss  |   5 +-
 themes/fid_bbi/scss/blocks/alert.scss         |   2 +-
 themes/fid_bbi/scss/blocks/badge.scss         |   2 +-
 themes/fid_bbi/scss/blocks/border.scss        |   6 -
 themes/fid_bbi/scss/blocks/box.scss           |  10 +-
 themes/fid_bbi/scss/blocks/button.scss        |   3 -
 themes/fid_bbi/scss/blocks/cart.scss          |   4 +
 themes/fid_bbi/scss/blocks/dbis.scss          |   4 +-
 themes/fid_bbi/scss/blocks/facet.scss         |  22 +-
 themes/fid_bbi/scss/blocks/filters.scss       |  10 +-
 themes/fid_bbi/scss/blocks/footer.scss        |   6 +-
 themes/fid_bbi/scss/blocks/form.scss          |  47 ++--
 themes/fid_bbi/scss/blocks/grid.scss          |   2 +-
 themes/fid_bbi/scss/blocks/header.scss        |  14 +-
 themes/fid_bbi/scss/blocks/icon.scss          |   9 +
 themes/fid_bbi/scss/blocks/item-list.scss     |   6 +-
 .../fid_bbi/scss/blocks/link-with-icon.scss   |  11 -
 themes/fid_bbi/scss/blocks/main.scss          |  10 +-
 themes/fid_bbi/scss/blocks/modal.scss         |  45 +++-
 themes/fid_bbi/scss/blocks/nav.scss           |  38 ++--
 themes/fid_bbi/scss/blocks/pagination.scss    |  12 +-
 themes/fid_bbi/scss/blocks/post.scss          |  10 +-
 themes/fid_bbi/scss/blocks/record.scss        |  72 +++----
 themes/fid_bbi/scss/blocks/required.scss      |   2 +-
 themes/fid_bbi/scss/blocks/result.scss        |  40 ++--
 themes/fid_bbi/scss/blocks/results.scss       |  34 +--
 themes/fid_bbi/scss/blocks/rvk.scss           |  15 +-
 themes/fid_bbi/scss/blocks/search.scss        |  44 ++--
 themes/fid_bbi/scss/blocks/sidebar.scss       |   4 +-
 themes/fid_bbi/scss/blocks/sources-list.scss  |   8 +-
 themes/fid_bbi/scss/blocks/sr-only.scss       |   2 +-
 themes/fid_bbi/scss/blocks/table.scss         |   2 +-
 themes/fid_bbi/scss/blocks/tabs.scss          |  14 +-
 themes/fid_bbi/scss/blocks/tagline.scss       |   2 +-
 themes/fid_bbi/scss/blocks/tags.scss          |   4 +-
 themes/fid_bbi/scss/blocks/to-top.scss        |   8 +-
 themes/fid_bbi/scss/blocks/toggle.scss        |  30 +++
 themes/fid_bbi/scss/blocks/tooltip.scss       |   3 +-
 themes/fid_bbi/scss/blocks/worldcat.scss      |  10 +
 themes/fid_bbi/scss/compiled.scss             |  12 +-
 themes/fid_bbi/scss/mixins/button.scss        |   4 +-
 themes/fid_bbi/scss/mixins/off-canvas.scss    |   4 +-
 themes/fid_bbi/scss/plugins/slim-select.scss  |   8 +-
 themes/fid_bbi/scss/print.scss                |  14 +-
 themes/fid_bbi/scss/util/fonts.scss           |   2 +
 themes/fid_bbi/scss/util/hacks.scss           | 137 ------------
 themes/fid_bbi/scss/util/misc.scss            |  72 +++++++
 themes/fid_bbi/scss/util/print.scss           |  56 +++++
 themes/fid_bbi/scss/util/settings.scss        |  48 ++---
 .../templates/Auth/AbstractBase/login.phtml   |  12 +-
 .../templates/Recommend/SideFacets.phtml      |  10 +-
 .../Recommend/SideFacets/filter-list.phtml    |   6 +-
 .../Recommend/SideFacets/range-slider.phtml   |   2 +-
 .../Recommend/SideFacets/single-facet.phtml   |  16 +-
 .../RecordDriver/DefaultRecord/core.phtml     |  20 +-
 .../DefaultRecord/data-rvkNotation.phtml      |   8 +-
 .../DefaultRecord/list-entry.phtml            |  24 +--
 .../DefaultRecord/result-list.phtml           |  24 +--
 .../RecordDriver/DefaultRecord/toolbar.phtml  |  25 ++-
 .../templates/RecordTab/holdingsils.phtml     |   4 +-
 .../templates/RecordTab/worldcat.phtml        |  12 +-
 .../fid_bbi/templates/ajax/boss-false.phtml   |   2 +-
 themes/fid_bbi/templates/ajax/boss-true.phtml |   2 +-
 .../templates/ajax/resolverLinks.phtml        |   2 +-
 .../fid_bbi/templates/amsl/sources-list.phtml |  10 +-
 themes/fid_bbi/templates/content/faq-en.phtml |  48 ++---
 themes/fid_bbi/templates/content/faq.phtml    |  48 ++---
 .../fid_bbi/templates/fid/user/create.phtml   |   4 +-
 .../fid_bbi/templates/finc/dbis/result.phtml  |   4 +-
 themes/fid_bbi/templates/footer.phtml         |  16 +-
 .../fid_bbi/templates/get-it-box/links.phtml  |   2 +-
 themes/fid_bbi/templates/header.phtml         |  24 +--
 themes/fid_bbi/templates/html-head.phtml      |   5 +-
 themes/fid_bbi/templates/layout/layout.phtml  |  18 +-
 .../myresearch/bulk-action-buttons.phtml      |  16 +-
 .../templates/myresearch/dbis-content.phtml   |   2 +-
 .../templates/myresearch/editlist.phtml       |   6 +-
 .../fid_bbi/templates/myresearch/menu.phtml   |   4 +-
 .../fid_bbi/templates/myresearch/mylist.phtml |  18 +-
 .../templates/myresearch/profile.phtml        |   8 +-
 .../templates/myresearch/usertags.phtml       |   4 +-
 themes/fid_bbi/templates/nav.phtml            |  16 +-
 .../templates/record/cart-buttons.phtml       |   8 +-
 themes/fid_bbi/templates/record/taglist.phtml |   6 +-
 themes/fid_bbi/templates/record/view.phtml    |   4 +-
 .../search/advanced-search-info.phtml         |   2 +-
 .../templates/search/controls/sort.phtml      |   2 +-
 themes/fid_bbi/templates/search/history.phtml |   4 +-
 themes/fid_bbi/templates/search/home.phtml    |  50 ++---
 .../fid_bbi/templates/search/pagination.phtml |  14 +-
 themes/fid_bbi/templates/search/results.phtml |  14 +-
 .../fid_bbi/templates/search/searchbox.phtml  | 201 +++++++++---------
 96 files changed, 901 insertions(+), 830 deletions(-)
 delete mode 100644 themes/fid_bbi/dummy-posts.json
 delete mode 100644 themes/fid_bbi/scss/blocks/border.scss
 delete mode 100644 themes/fid_bbi/scss/blocks/button.scss
 delete mode 100644 themes/fid_bbi/scss/blocks/link-with-icon.scss
 create mode 100644 themes/fid_bbi/scss/blocks/toggle.scss
 create mode 100644 themes/fid_bbi/scss/blocks/worldcat.scss
 delete mode 100644 themes/fid_bbi/scss/util/hacks.scss
 create mode 100644 themes/fid_bbi/scss/util/misc.scss
 create mode 100644 themes/fid_bbi/scss/util/print.scss

diff --git a/themes/fid_bbi/dummy-posts.json b/themes/fid_bbi/dummy-posts.json
deleted file mode 100644
index 247a08f5385..00000000000
--- a/themes/fid_bbi/dummy-posts.json
+++ /dev/null
@@ -1,22 +0,0 @@
-[
-  {
-    "date": "2020-09-27",
-    "title": "Lorem ipsum dolor sit amet",
-    "excerpt": "Eu sit hinc feugiat iracundia. Cum inimicus accommodare ne, te eam exerci fuisset consequuntur. Mei cu cibo phaedrum. Cu eos legere soluta populo, no suas aeque &hellip;"
-  },
-  {
-    "date": "2020-09-20",
-    "title": "At mel erroribus rationibus",
-    "excerpt": "Inermis admodum tacimates eu mea. Et aeterno epicurei mea, etiam saepe at duo. Ei ubique libris vim, affert ullamcorper ea his. Ea aperiam fastidii incorrupte nam, ei vix&hellip;"
-  },
-  {
-    "date": "2020-08-15",
-    "title": "Vix eu mediocrem eloquentiam",
-    "excerpt": "Ea aperiam fastidii incorrupte nam, ei vix tempor putent. Vix eu mediocrem eloquentiam, nec agam rationibus cu. Ponderum verterem te sea, invidunt persecuti concludaturque his &hellip;"
-  },
-  {
-    "date": "2020-08-03",
-    "title": "Affert intellegebat pri no",
-    "excerpt": "Eos veri laoreet at, sit odio aliquando definitionem ad. Ut veritus alienum epicurei vim, eros labore consulatu at mel. Sint eius ne eum, at qui pertinax imperdiet cotidieque &hellip;"
-  }
-]
diff --git a/themes/fid_bbi/js/theme.js b/themes/fid_bbi/js/theme.js
index 77585b48dd6..4ddd682c227 100644
--- a/themes/fid_bbi/js/theme.js
+++ b/themes/fid_bbi/js/theme.js
@@ -1,4 +1,4 @@
-/*global VuFind */
+/* global VuFind */
 'use strict'
 
 // NOTE: Required packages/scripts:
@@ -20,10 +20,10 @@ const theme = {
       // eslint-disable-next-line no-new
       new StickySidebar('#sidebar', {
         topSpacing: 28,
-        bottomSpacing: 28,
+        bottomSpacing: 0,
         containerSelector: '#sidebar-container',
         innerWrapperSelector: '#sidebar-inner',
-        minWidth: 1024, // NOTE: Must match the `$bp4` breakpoint + 1px as set in `scss/util/settings.scss`.
+        minWidth: 1024, // NOTE: Must match the `$bp4` breakpoint (see scss/util/settings.scss)
       })
     }
 
@@ -84,8 +84,8 @@ const theme = {
         continue
       }
 
-      // Exclude type select in advanced search: These fields are cloned an
-      // extra handling for re-initializing SlimSelect would be required
+      // Exclude "type" select in advanced search; these fields are cloned,
+      // so SlimSelect would have to be re-initialized
       if (select.classList.contains('adv-term-type')) {
         continue
       }
@@ -93,8 +93,8 @@ const theme = {
       new SlimSelect({ // eslint-disable-line no-new
         select,
         closeOnSelect: !isMultiSelect,
-        placeholder: VuFind.translate("slimselect_placeholder"),
-        searchText: VuFind.translate("slimselect_empty_result"),
+        placeholder: VuFind.translate('slimselect_placeholder'),
+        searchText: VuFind.translate('slimselect_empty_result'),
         searchPlaceholder: 'Filter',
         searchFocus: true,
         searchHighlight: true,
diff --git a/themes/fid_bbi/scss/base/common.scss b/themes/fid_bbi/scss/base/common.scss
index b4f24adc9e6..015034cf6ce 100644
--- a/themes/fid_bbi/scss/base/common.scss
+++ b/themes/fid_bbi/scss/base/common.scss
@@ -39,6 +39,18 @@ a {
     }
   }
 
+  &.-icon {
+    margin-left: g(1.25);
+
+    > .icon {
+      margin-left: g(-1.25);
+      padding-right: g(.25);
+      pointer-events: auto;
+      position: absolute; // Prevent icons from increasing link height
+      width: g(1 + .25); // Account for padding
+    }
+  }
+
   &.-image {
     @include hover {
       box-shadow: none;
@@ -81,7 +93,7 @@ cite {
 }
 
 code {
-  background: mix($text-muted-color, #fff, 10);
+  background: $shade-weak;
   font-size: $font-size-small;
   padding: 0 .2em;
 }
@@ -189,13 +201,13 @@ ol {
   @include paragraph;
   counter-reset: li;
   list-style: none;
-  padding-left: g();
+  padding-left: g(1.25);
 
   li {
     counter-increment: li;
 
     &::before {
-      color: $color-a;
+      color: $green;
       content: '.' counter(li);
       direction: rtl;
       display: inline-block;
@@ -278,19 +290,19 @@ th {
 }
 
 tr {
-  box-shadow: 0 -2px #000 inset;
+  box-shadow: 0 -2px $black inset;
 }
 
 ul {
   @include paragraph;
   list-style: none;
-  padding-left: g();
+  padding-left: g(1.25);
 
   li {
     counter-increment: none; // prevent child ul from incrementing parent ol's counter
 
     &::before {
-      background: currentColor;
+      background: $text-color;
       content: '';
       height: g(.25);
       margin: round($line-height / 2 - g(.25) / 2) 0 0 g(-.75);
@@ -304,7 +316,3 @@ video {
   height: auto;
   max-width: 100%;
 }
-
-.hidden {
-  display: none;
-}
diff --git a/themes/fid_bbi/scss/base/form.scss b/themes/fid_bbi/scss/base/form.scss
index 22daa336712..767b9bb6cda 100644
--- a/themes/fid_bbi/scss/base/form.scss
+++ b/themes/fid_bbi/scss/base/form.scss
@@ -59,7 +59,7 @@ label {
 
   &[data-required=true] {
     &::after {
-      color: $color-a;
+      color: $green;
       content: '*';
       margin-left: .2em;
     }
@@ -85,8 +85,9 @@ textarea {
 [type=url],
 textarea {
   appearance: none; // iOS fix
-  background-color: mix(#000, #fff, 5);
+  background-color: mix($black, $white, 5);
   border: 2px solid;
+  border-radius: 0; // Edge fix
   box-shadow: none;
   font-weight: 500;
   max-width: 100%;
@@ -95,7 +96,7 @@ textarea {
   transition: box-shadow ($td / 2);
 
   @include hover {
-    background-color: #fff;
+    background-color: $white;
     outline: 0;
   }
 
@@ -124,7 +125,7 @@ textarea {
     padding-left: g(1.5);
 
     &::before {
-      background: #fff center center no-repeat;
+      background: $white center center no-repeat;
       border: 2px solid;
       content: '';
       display: inline-block;
@@ -174,7 +175,7 @@ select {
   padding-left: g();
 
   @include hover {
-    background-color: #fff;
+    background-color: $white;
   }
 
   &.-inline {
diff --git a/themes/fid_bbi/scss/blocks/advanced-search.scss b/themes/fid_bbi/scss/blocks/advanced-search.scss
index a07bd99b2a3..1edaf81f6ef 100644
--- a/themes/fid_bbi/scss/blocks/advanced-search.scss
+++ b/themes/fid_bbi/scss/blocks/advanced-search.scss
@@ -8,8 +8,9 @@
 
   // Group of multiple searches
   .adv-group {
-    @extend .border;
-    margin: g() auto !important; // Override .border margin
+    border: 2px solid $text-color;
+    margin: g() auto !important;
+    padding: g() - 2px;
     position: relative;
   }
 
diff --git a/themes/fid_bbi/scss/blocks/alert.scss b/themes/fid_bbi/scss/blocks/alert.scss
index f3014f1cd22..2ce3eb02126 100644
--- a/themes/fid_bbi/scss/blocks/alert.scss
+++ b/themes/fid_bbi/scss/blocks/alert.scss
@@ -50,7 +50,7 @@
     }
   }
 
-  .main_wrap > &:first-child {
+  .main-wrap > &:first-child {
     margin-top: g();
   }
 
diff --git a/themes/fid_bbi/scss/blocks/badge.scss b/themes/fid_bbi/scss/blocks/badge.scss
index 37635a1dbed..29e0c689253 100644
--- a/themes/fid_bbi/scss/blocks/badge.scss
+++ b/themes/fid_bbi/scss/blocks/badge.scss
@@ -1,6 +1,6 @@
 .badge {
   background: $text-muted-color;
-  color: #fff;
+  color: $white;
   display: inline-block;
   margin: 0 g(-.5) 0 auto;
   padding: 0 g(.25);
diff --git a/themes/fid_bbi/scss/blocks/border.scss b/themes/fid_bbi/scss/blocks/border.scss
deleted file mode 100644
index a126d029aba..00000000000
--- a/themes/fid_bbi/scss/blocks/border.scss
+++ /dev/null
@@ -1,6 +0,0 @@
-.border {
-  border: 2px solid $text-color;
-  margin: 0 auto;
-  max-width: $line-width;
-  padding: g() - 2px;
-}
diff --git a/themes/fid_bbi/scss/blocks/box.scss b/themes/fid_bbi/scss/blocks/box.scss
index 6f71b3d0db1..5cfab748a3d 100644
--- a/themes/fid_bbi/scss/blocks/box.scss
+++ b/themes/fid_bbi/scss/blocks/box.scss
@@ -6,6 +6,7 @@
     61.8% 100%,
     0 calc(100% - #{g(1.25)})
   );
+
   $clip-path-b: polygon(
     0 0,
     100% 0,
@@ -13,8 +14,9 @@
     38.2% 100%,
     0 calc(100% - #{g(1.25)})
   );
+
   clip-path: $clip-path-a;
-  color: #fff;
+  color: $white;
   flex: 1;
   font-weight: 500;
   margin: g() g(-1) g(2);
@@ -27,7 +29,7 @@
   }
 
   &::after {
-    background: linear-gradient((90deg + $skew), $color-a, $color-c);
+    background: linear-gradient((90deg + $skew), $green, $blue);
     content: '';
     display: block;
     height: 100%;
@@ -38,7 +40,7 @@
     z-index: -1;
 
     @media #{$bp5} {
-      background: linear-gradient(90deg, $color-a, $color-c);
+      background: linear-gradient(90deg, $green, $blue);
       transform: skew(-$skew);
       transform-origin: top left;
     }
@@ -62,7 +64,7 @@
     }
 
     &::after {
-      background: linear-gradient(90deg, $color-c, $color-a);
+      background: linear-gradient(90deg, $blue, $green);
       left: auto;
       right: 0;
       transform-origin: bottom right;
diff --git a/themes/fid_bbi/scss/blocks/button.scss b/themes/fid_bbi/scss/blocks/button.scss
deleted file mode 100644
index 2a0aed540f1..00000000000
--- a/themes/fid_bbi/scss/blocks/button.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-.button {
-  @include button;
-}
diff --git a/themes/fid_bbi/scss/blocks/cart.scss b/themes/fid_bbi/scss/blocks/cart.scss
index eb85702cf98..5d66b80e2ab 100644
--- a/themes/fid_bbi/scss/blocks/cart.scss
+++ b/themes/fid_bbi/scss/blocks/cart.scss
@@ -1,3 +1,7 @@
+.cart {
+  max-width: $line-width;
+}
+
 .cart-controls {
   display: inline-flex;
   flex-wrap: wrap;
diff --git a/themes/fid_bbi/scss/blocks/dbis.scss b/themes/fid_bbi/scss/blocks/dbis.scss
index 8be659e915f..4966820635c 100644
--- a/themes/fid_bbi/scss/blocks/dbis.scss
+++ b/themes/fid_bbi/scss/blocks/dbis.scss
@@ -2,12 +2,12 @@
   //
 }
 
-.dbis_icon {
+.dbis-icon {
   flex: 0 0 g();
   margin-right: g(.25);
 }
 
-.dbis_list {
+.dbis-list {
   list-style: none;
   padding-left: 0;
 
diff --git a/themes/fid_bbi/scss/blocks/facet.scss b/themes/fid_bbi/scss/blocks/facet.scss
index cbecaff866a..632d4a55341 100644
--- a/themes/fid_bbi/scss/blocks/facet.scss
+++ b/themes/fid_bbi/scss/blocks/facet.scss
@@ -14,7 +14,7 @@
   }
 }
 
-.facet_badge {
+.facet-badge {
   background: none;
   color: $text-muted-color;
   font-size: $font-size-small;
@@ -22,7 +22,7 @@
   padding: 0;
 }
 
-.facet_link {
+.facet-link {
   display: flex;
   margin: g(-.25);
   overflow: hidden;
@@ -44,7 +44,7 @@
   }
 }
 
-.facet_links {
+.facet-links {
   &.-collapsed {
     li:nth-child(n+6) {
       display: none;
@@ -52,7 +52,7 @@
   }
 }
 
-.facet_links-toggle {
+.facet-links-toggle {
   background: none;
   border: 0;
   display: none;
@@ -63,11 +63,11 @@
   text-align: left;
   width: calc(100% + #{g(.25 * 2)});
 
-  .facet_links.-collapsed &.-expand {
+  .facet-links.-collapsed &.-expand {
     display: block;
   }
 
-  .facet_links:not(.-collapsed) &.-collapse {
+  .facet-links:not(.-collapsed) &.-collapse {
     display: block;
   }
 
@@ -76,8 +76,8 @@
   }
 }
 
-.facet_minus,
-.facet_plus {
+.facet-minus,
+.facet-plus {
   align-self: flex-start;
   border: 2px solid;
   display: inline-block;
@@ -90,15 +90,15 @@
   &.-selected {
     background: $link-color;
     border-color: $link-color;
-    color: #fff;
+    color: $white;
   }
 }
 
-.facet_plus {
+.facet-plus {
   margin-right: g(.5);
 }
 
-.facet_text {
+.facet-text {
   flex: 1;
   margin-right: g(.5);
   overflow: hidden;
diff --git a/themes/fid_bbi/scss/blocks/filters.scss b/themes/fid_bbi/scss/blocks/filters.scss
index c8c23f17056..480cccd4be4 100644
--- a/themes/fid_bbi/scss/blocks/filters.scss
+++ b/themes/fid_bbi/scss/blocks/filters.scss
@@ -2,7 +2,7 @@
   //
 }
 
-.filters_active {
+.filters-active {
   border: 2px solid $text-color;
   margin-bottom: g();
   padding: g() - 2px;
@@ -27,7 +27,7 @@
   }
 }
 
-.filters_filter {
+.filters-filter {
   & + & {
     margin-top: g(1 - .25);
   }
@@ -41,7 +41,7 @@
 }
 
 // List toggle button
-.filters_title {
+.filters-title {
   background: none;
   border: 0;
   color: inherit;
@@ -61,12 +61,12 @@
     float: right;
   }
 
-  &[aria-expanded='true'] .icon {
+  &[aria-expanded=true] .icon {
     transform: rotate(180deg);
   }
 }
 
-.filters_years {
+.filters-years {
   display: flex;
   margin-bottom: g(.5);
 
diff --git a/themes/fid_bbi/scss/blocks/footer.scss b/themes/fid_bbi/scss/blocks/footer.scss
index 556ad280c24..1a61d21b063 100644
--- a/themes/fid_bbi/scss/blocks/footer.scss
+++ b/themes/fid_bbi/scss/blocks/footer.scss
@@ -27,7 +27,7 @@
   }
 }
 
-.footer_links {
+.footer-links {
   margin: g(-.5) g(-.5) g(-.5 - 1) g(-.5) !important; // override last-child margin
   padding: 0;
   width: auto;
@@ -45,7 +45,7 @@
   }
 }
 
-.footer_partners {
+.footer-partners {
   align-items: center;
   align-self: flex-start;
   display: flex;
@@ -69,7 +69,7 @@
   }
 }
 
-.footer_wrap {
+.footer-wrap {
   margin: 0 auto;
   max-width: $max-width;
 }
diff --git a/themes/fid_bbi/scss/blocks/form.scss b/themes/fid_bbi/scss/blocks/form.scss
index 28b229edf60..23264e41652 100644
--- a/themes/fid_bbi/scss/blocks/form.scss
+++ b/themes/fid_bbi/scss/blocks/form.scss
@@ -2,7 +2,7 @@
   //
 }
 
-.form_footer {
+.form-footer {
   @include paragraph;
 
   @media #{$bp3} {
@@ -13,7 +13,7 @@
   }
 }
 
-.form_footer-links {
+.form-footer-links {
   display: flex;
   flex-wrap: wrap;
   list-style: none;
@@ -35,9 +35,7 @@
   }
 }
 
-// TODO: Merge classes
-.form-group,
-.form_row {
+.form-group {
   @include paragraph;
   align-items: flex-start;
   display: flex;
@@ -46,15 +44,19 @@
 
   &:last-child {
     margin-bottom: 0;
-  }
 
-  &.-center {
-    justify-content: center;
-    text-align: center;
+    // Last row containing a "cancel" link and the submit button
+    > .col-lg-11 {
+      width: 100%;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      flex-direction: row-reverse;
+    }
   }
 
-  &.-margin-half {
-    margin-bottom: g(.5);
+  .field-set > &:last-child {
+    margin-bottom: g();
   }
 
   > label {
@@ -75,8 +77,7 @@
   > [type=text],
   > [type=url],
   > select,
-  > textarea,
-  > .form-control {
+  > textarea {
     margin: 0;
     width: 100%;
 
@@ -110,14 +111,18 @@
   > .btn-link {
     margin: g(.5) g(.5) g(.5) 0;
   }
-}
 
-.form_label {
-  @extend label;
-  flex: 1;
+  // Last row of forms, containing a "cancel" link and the submit button
+  &:last-child > .col-lg-11 {
+    width: 100%;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    flex-direction: row-reverse;
+  }
 }
 
-.form_control {
+.form-inputs {
   margin: 0;
   width: 100%;
 
@@ -148,7 +153,7 @@
   }
 }
 
-// TODO: Move?
-.help-block {
-  margin-top: g(.5);
+.form-label {
+  @extend label;
+  flex: 1;
 }
diff --git a/themes/fid_bbi/scss/blocks/grid.scss b/themes/fid_bbi/scss/blocks/grid.scss
index 75710424a88..a5abc07fe7c 100644
--- a/themes/fid_bbi/scss/blocks/grid.scss
+++ b/themes/fid_bbi/scss/blocks/grid.scss
@@ -35,7 +35,7 @@
 }
 
 @for $i from 1 through 12 {
-  .grid_#{$i} {
+  .grid-#{$i} {
     flex: percentage($i / 12);
     min-width: percentage($i / 12);
   }
diff --git a/themes/fid_bbi/scss/blocks/header.scss b/themes/fid_bbi/scss/blocks/header.scss
index cefac7e3337..66389c829f1 100644
--- a/themes/fid_bbi/scss/blocks/header.scss
+++ b/themes/fid_bbi/scss/blocks/header.scss
@@ -13,7 +13,7 @@
   }
 }
 
-.header_login {
+.header-login {
   display: none;
   margin: 0 auto;
   max-width: $max-width;
@@ -32,7 +32,7 @@
   }
 }
 
-.header_logo {
+.header-logo {
   display: block;
   position: relative;
   text-align: center;
@@ -125,10 +125,10 @@
   }
 }
 
-.header_logo-overlay {
-  background: #fff;
+.header-logo-overlay {
+  background: $white;
   bottom: -8px; // Align with logo text
-  color: #000;
+  color: $black;
   display: none;
   font: #{$font-size-special}/32px display-font, sans-serif;
   left: 126px;
@@ -141,7 +141,7 @@
   }
 }
 
-.header_main {
+.header-main {
   align-items: flex-start;
   display: flex;
   justify-content: flex-start;
@@ -159,7 +159,7 @@
   }
 }
 
-.header_nav {
+.header-nav {
   flex: 1;
 
   .layout.-default & {
diff --git a/themes/fid_bbi/scss/blocks/icon.scss b/themes/fid_bbi/scss/blocks/icon.scss
index 39f96abcf35..84647d7cd35 100644
--- a/themes/fid_bbi/scss/blocks/icon.scss
+++ b/themes/fid_bbi/scss/blocks/icon.scss
@@ -29,3 +29,12 @@
     }
   }
 }
+
+// .in-list is set via JS on the add-to-favorites button, fill the icon
+.in-list {
+  .icon {
+    path {
+      fill: currentColor;
+    }
+  }
+}
diff --git a/themes/fid_bbi/scss/blocks/item-list.scss b/themes/fid_bbi/scss/blocks/item-list.scss
index 4e95ea52465..859e4c3e4c5 100644
--- a/themes/fid_bbi/scss/blocks/item-list.scss
+++ b/themes/fid_bbi/scss/blocks/item-list.scss
@@ -2,7 +2,7 @@
   @include paragraph;
 }
 
-.item-list_item {
+.item-list-item {
   align-items: flex-start;
   display: flex;
   min-height: g(3);
@@ -15,7 +15,7 @@
   }
 }
 
-.item-list_prefix {
+.item-list-prefix {
   // Hexagon
   background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='66' width='56'%3E%3Cpath d='M55 16.834L28 1.156 1 16.834v31.355l27 15.677 27-15.677z' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E") center 0 no-repeat;
   flex: 0 0 g(2);
@@ -39,6 +39,6 @@
   }
 }
 
-.item-list_content {
+.item-list-content {
   font-weight: 500;
 }
diff --git a/themes/fid_bbi/scss/blocks/link-with-icon.scss b/themes/fid_bbi/scss/blocks/link-with-icon.scss
deleted file mode 100644
index 390da5d0e6a..00000000000
--- a/themes/fid_bbi/scss/blocks/link-with-icon.scss
+++ /dev/null
@@ -1,11 +0,0 @@
-.link-with-icon {
-  margin-left: g(1.25);
-
-  > .icon {
-    margin-left: g(-1.25);
-    padding-right: g(.25);
-    pointer-events: auto;
-    position: absolute; // Prevent icons from increasing link height
-    width: g(1 + .25); // Account for padding
-  }
-}
diff --git a/themes/fid_bbi/scss/blocks/main.scss b/themes/fid_bbi/scss/blocks/main.scss
index a8447d6d684..4d555b6048a 100644
--- a/themes/fid_bbi/scss/blocks/main.scss
+++ b/themes/fid_bbi/scss/blocks/main.scss
@@ -2,15 +2,23 @@
   @include sticky-footer(content);
   display: flex;
   flex-direction: column;
+  overflow: hidden; // prevent boxes from increasing container width
   padding: 0 g();
 }
 
-.main_wrap {
+.main-wrap {
   margin: 0 auto;
   max-width: 100%;
   position: relative;
   width: $max-width;
 
+
+  // .container must be added to .main-wrap for the create-list modal JS
+  // to work, but we don't want its styles here
+  &.container {
+    display: block;
+  }
+
   // For elements like `<div>* required</div>`
   > div:not([class]) {
     @include paragraph;
diff --git a/themes/fid_bbi/scss/blocks/modal.scss b/themes/fid_bbi/scss/blocks/modal.scss
index 60671616adc..c6d0bfcdfdb 100644
--- a/themes/fid_bbi/scss/blocks/modal.scss
+++ b/themes/fid_bbi/scss/blocks/modal.scss
@@ -20,7 +20,7 @@
   }
 
   &::after {
-    background: rgba(#000, .4);
+    background: rgba($black, .4);
     bottom: 0;
     content: '';
     display: block;
@@ -42,8 +42,8 @@
   }
 }
 
-.modal_content {
-  background: #fff;
+.modal-content {
+  background: $white;
   border: 2px solid;
   max-height: 100%;
   max-width: 100%;
@@ -75,7 +75,44 @@
   }
 }
 
-.modal_main {
+.modal-loading {
+  // The FID BBI logo icon, animated
+  $svg: '<svg viewBox="0 0 45 131" width="45" height="131">
+    <style>
+      .blip {
+        stroke-dasharray: 300;
+        stroke-dashoffset: 300;
+        animation: dash 2s linear infinite;
+      }
+      @keyframes dash {
+        to { stroke-dashoffset: 0; }
+      }
+    </style>
+    <path
+      class="blip"
+      d="M 1,119.06565 43.508026,82.402623 m 0,0 L 24.117014,1.0945735 M 1,119.06615 24.117014,1.0945735 M 1,119.06615 24.117014,75.736619 43.508026,82.402623 M 24.117014,1.0945735 V 129.32465 M 1,26.862089 24.117014,32.962593 43.508026,5.0585759 M 1,26.862089 v 92.203561 l 23.117014,10.259 19.391012,-46.922027 V 5.0585759 L 24.117014,1.0945735 Z"
+      fill="none"
+      stroke="#000"
+      stroke-width="2"
+    />
+  </svg>';
+
+  background: $shine-strong svg-url($svg) center center no-repeat;
+  bottom: 0;
+  display: block;
+  left: 0;
+  position: absolute;
+  right: 0;
+  top: 0;
+  z-index: 9;
+
+  + h1,
+  + h2 {
+    margin-top: 0;
+  }
+}
+
+.modal-main {
   min-height: g(3.5); // make sure "x" button is always fully visible
   padding: g();
 }
diff --git a/themes/fid_bbi/scss/blocks/nav.scss b/themes/fid_bbi/scss/blocks/nav.scss
index e16b531eef6..048ac909c2e 100644
--- a/themes/fid_bbi/scss/blocks/nav.scss
+++ b/themes/fid_bbi/scss/blocks/nav.scss
@@ -14,6 +14,10 @@
     }
   }
 
+  ul {
+    max-width: none; // Fix off-canvas nav on medium screens
+  }
+
   li {
     display: block;
 
@@ -32,8 +36,8 @@
   }
 }
 
-.nav_aside {
-  background: #fff;
+.nav-aside {
+  background: $white;
   border-bottom: 2px solid;
   border-right: 2px solid;
   font-size: $font-size-small;
@@ -56,7 +60,7 @@
   }
 
   &::before {
-    background: #fff;
+    background: $white;
     border-bottom: 2px solid;
     border-left: 2px solid;
     content: '';
@@ -84,12 +88,12 @@
     text-align: center;
 
     @include hover {
-      background: mix(#000, #fff, 10);
+      background: mix($black, $white, 10);
     }
 
     &.-current {
       background: $text-color;
-      color: #fff;
+      color: $white;
     }
 
     span {
@@ -108,7 +112,7 @@
 
     &::before {
       @media #{$bp1} {
-        background: #fff;
+        background: $white;
         content: '';
         display: block;
         height: 100%;
@@ -122,7 +126,7 @@
 
     @include hover {
       &::before {
-        background: mix(#000, #fff, 10); // Same as parent
+        background: mix($black, $white, 10); // Same as parent
       }
     }
   }
@@ -136,7 +140,7 @@
   }
 }
 
-.nav_header {
+.nav-header {
   display: none;
 
   .layout.-default & {
@@ -148,23 +152,23 @@
   }
 }
 
-.nav_home {
+.nav-home {
   .layout.-home & {
     display: none;
   }
 }
 
-.nav_lang {
+.nav-lang {
   text-transform: uppercase;
 }
 
-.nav_main {
+.nav-main {
   .layout.-default & {
     @include off-canvas;
 
     @media #{$bp5} {
       @include on-canvas;
-      color: #fff;
+      color: $white;
       font: #{$font-size}/#{$line-height} text-font, sans-serif;
       font-weight: bold;
       margin: g(-.5);
@@ -238,9 +242,9 @@
   }
 }
 
-.nav_toggle {
+.nav-toggle {
   background: none;
-  color: #fff;
+  color: $white;
   display: none;
   margin-top: g(2.5);
   overflow: hidden;
@@ -253,7 +257,7 @@
 
   @include hover {
     background: $shine;
-    color: #fff;
+    color: $white;
   }
 
   .icon {
@@ -269,7 +273,7 @@
         width: auto;
 
         .icon {
-          color: $color-a;
+          color: $green;
         }
       }
 
@@ -284,7 +288,7 @@
         width: auto;
 
         .icon {
-          color: $color-a;
+          color: $green;
         }
       }
 
diff --git a/themes/fid_bbi/scss/blocks/pagination.scss b/themes/fid_bbi/scss/blocks/pagination.scss
index abe6f824e24..f95284ea6f3 100644
--- a/themes/fid_bbi/scss/blocks/pagination.scss
+++ b/themes/fid_bbi/scss/blocks/pagination.scss
@@ -7,8 +7,8 @@
   flex-wrap: wrap;
   width: auto;
 
-  .results_header + & {
-    margin-top: g(-.25); // align with sidebar buttons
+  .results-header + & {
+    margin-top: g(-.25); // Align with sidebar buttons
   }
 
   @media #{$bp5} {
@@ -16,7 +16,7 @@
   }
 }
 
-.pagination_control {
+.pagination-control {
   min-width: g(1.5);
 
   &:last-child {
@@ -24,7 +24,7 @@
   }
 }
 
-.pagination_link {
+.pagination-link {
   @include button-small;
   display: inline-block;
   padding: (g(.25) - 2px);
@@ -34,11 +34,11 @@
   }
 }
 
-.pagination_link-label {
+.pagination-link-label {
   @include sr-only;
 }
 
-.pagination_page {
+.pagination-page {
   flex: 1;
   margin: 0 g(.5);
   text-align: center;
diff --git a/themes/fid_bbi/scss/blocks/post.scss b/themes/fid_bbi/scss/blocks/post.scss
index 857a9a8ec64..e3fd0238b6b 100644
--- a/themes/fid_bbi/scss/blocks/post.scss
+++ b/themes/fid_bbi/scss/blocks/post.scss
@@ -9,8 +9,8 @@
   }
 }
 
-.post_date {
-  color: $color-b;
+.post-date {
+  color: $red;
   font-size: $font-size-small;
   font-weight: bold;
   line-height: g(.75);
@@ -19,11 +19,11 @@
   order: -1;
 }
 
-.post_excerpt {
+.post-excerpt {
   margin-bottom: 0;
 }
 
-.post_link {
+.post-link {
   @include extend-clickable-area;
   display: flex;
   flex-direction: column;
@@ -34,6 +34,6 @@
   }
 }
 
-.post_title {
+.post-title {
   margin: 0;
 }
diff --git a/themes/fid_bbi/scss/blocks/record.scss b/themes/fid_bbi/scss/blocks/record.scss
index 3a617eb7d5e..08b532ed4f8 100644
--- a/themes/fid_bbi/scss/blocks/record.scss
+++ b/themes/fid_bbi/scss/blocks/record.scss
@@ -8,7 +8,7 @@
 
   h1 {
     @include heading(2);
-    color: #000;
+    color: $black;
     margin: 0;
     text-align: left;
   }
@@ -22,6 +22,21 @@
     margin: g() 0 g(.5);
   }
 
+  table {
+    margin: 0 0 g();
+    min-width: 0;
+
+    tr {
+      box-shadow: none;
+    }
+
+    th,
+    td {
+      padding-top: 0;
+      padding-bottom: 0;
+    }
+  }
+
   .box {
     padding: g() g() g(1 + 1);
 
@@ -32,7 +47,7 @@
   }
 }
 
-.record_access {
+.record-access {
   display: block;
 
   @media #{$bp3} {
@@ -44,6 +59,10 @@
     padding-left: g() - 2px;
   }
 
+  a.-icon {
+    margin-left: g() + 2px; // Align external-link icons with content
+  }
+
   h2 {
     color: inherit;
     flex: 0 0 g(8);
@@ -57,7 +76,7 @@
     margin: 0 0 g(.5);
   }
 
-  .link-with-icon {
+  a.-icon {
     margin-left: g() + 2px; // Align external-link icons with content
   }
 
@@ -71,21 +90,21 @@
         margin-top: 0;
       }
 
-      > .link-with-icon {
+      > a.-icon {
         margin-left: 0;
       }
     }
   }
 }
 
-.record_actions {
+.record-actions {
   display: flex;
   flex-wrap: wrap;
   margin-bottom: g(0);
   position: relative; // required for dropdowns
 }
 
-.record_action {
+.record-action {
   @include button-icon-bg(small);
   @include button-small;
   display: flex;
@@ -104,26 +123,21 @@
   &.cart-remove {
     .icon {
       path {
-        fill: #fff;
+        fill: $white;
       }
     }
   }
 
-  .icon {
-    color: #fff;
-    margin-right: g(.75);
-  }
-
-  .record_actions.-secondary & {
+  .record-actions.-secondary & {
     width: calc(50% - #{g(.5)});
   }
 }
 
-.record_action-group {
+.record-action-group {
   width: 100%;
 }
 
-.record_getitbox {
+.record-getitbox {
   .boss-data-false,
   .boss-data-true {
     &:empty {
@@ -132,7 +146,7 @@
   }
 }
 
-.record_header {
+.record-header {
   flex: 1;
 
   > h1,
@@ -149,7 +163,7 @@
   }
 }
 
-.record_holdingsils {
+.record-holdingsils {
   .ezb-message {
     &:not(:last-child) {
       margin-bottom: g(.5);
@@ -168,23 +182,7 @@
   }
 }
 
-.record table,
-.record_internal {
-  margin: 0 0 g();
-  min-width: 0;
-
-  tr {
-    box-shadow: none;
-  }
-
-  th,
-  td {
-    padding-top: 0;
-    padding-bottom: 0;
-  }
-}
-
-.record_links {
+.record-links {
   font-size: $font-size-small;
   list-style: none;
   margin: g(-.5) g(-.5) g(-.5 + 1.5);
@@ -205,7 +203,7 @@
   }
 }
 
-.record_main {
+.record-main {
   align-items: flex-start;
   display: block;
   margin-bottom: g(1);
@@ -224,7 +222,7 @@
   }
 }
 
-.record_sidebar {
+.record-sidebar {
   align-items: flex-start;
   display: block;
   flex: 0 0 g(12.5);
@@ -241,7 +239,7 @@
   }
 }
 
-.record_type {
+.record-type {
   display: none;
   margin-left: g(-4);
   margin-right: g();
diff --git a/themes/fid_bbi/scss/blocks/required.scss b/themes/fid_bbi/scss/blocks/required.scss
index 4a32162abf2..8817c3727eb 100644
--- a/themes/fid_bbi/scss/blocks/required.scss
+++ b/themes/fid_bbi/scss/blocks/required.scss
@@ -1,6 +1,6 @@
 .required {
   &::after {
-    color: $color-a;
+    color: $green;
     content: '*';
     font-weight: 500;
   }
diff --git a/themes/fid_bbi/scss/blocks/result.scss b/themes/fid_bbi/scss/blocks/result.scss
index 17f13142ac3..14c33af7279 100644
--- a/themes/fid_bbi/scss/blocks/result.scss
+++ b/themes/fid_bbi/scss/blocks/result.scss
@@ -8,7 +8,7 @@
   }
 }
 
-.result_actions {
+.result-actions {
   margin: g(-.25) g(.25) g(-.25) g(.25 + 1);
 
   > a,
@@ -25,23 +25,23 @@
   }
 }
 
-.result_author {
+.result-author {
   //
 }
 
-.result_collection {
-  margin-left: g();
-  text-indent: g(-1);
+.result-collection {
+  margin-left: g(.75);
+  text-indent: g(-.75);
 }
 
-.result_details {
+.result-details {
   border-left: 2px solid;
   flex: 1;
   font-size: $font-size-small;
   padding-left: g() - 2px;
 }
 
-.result_link {
+.result-link {
   @include extend-clickable-area;
   display: block;
   margin-bottom: g(.25);
@@ -56,31 +56,31 @@
   }
 }
 
-.result_place {
-  margin-left: g();
-  text-indent: g(-1);
+.result-place {
+  margin-left: g(.75);
+  text-indent: g(-.75);
 }
 
-.result_media {
+.result-media {
   font-weight: bold;
 }
 
-.result_snippet {
-  margin-left: g();
-  text-indent: g(-1);
+.result-snippet {
+  margin-left: g(.75);
+  text-indent: g(-.75);
 }
 
-.result_source {
-  margin-left: g();
-  text-indent: g(-1);
+.result-source {
+  margin-left: g(.75);
+  text-indent: g(-.75);
 }
 
-.result_subtitle {
+.result-subtitle {
   font-weight: bold;
   margin: g(-.25) 0 g(.25);
 }
 
-.result_title {
+.result-title {
   margin-bottom: g(.5);
 
   a {
@@ -88,7 +88,7 @@
   }
 }
 
-.result_type {
+.result-type {
   display: none;
   flex: 0 0 g(3);
   margin-right: g();
diff --git a/themes/fid_bbi/scss/blocks/results.scss b/themes/fid_bbi/scss/blocks/results.scss
index 98ac8a76182..5bb65936c6a 100644
--- a/themes/fid_bbi/scss/blocks/results.scss
+++ b/themes/fid_bbi/scss/blocks/results.scss
@@ -3,7 +3,7 @@
   margin: g() g(-1) 0;
 }
 
-.results_actions {
+.results-actions {
   display: flex;
   flex-wrap: wrap;
   margin: g(-.25);
@@ -23,13 +23,13 @@
     }
 
     .icon {
-      color: #fff;
+      color: $white;
       margin-right: g(.75);
     }
   }
 }
 
-.results_advanced-search-info {
+.results-advanced-search-info {
   @extend .alert;
   color: $text-muted-color;
   margin: g(.25) g(.25) g(.25 + .5);
@@ -40,11 +40,11 @@
   }
 }
 
-.results_bulk-actions {
+.results-bulk-actions {
   margin: 0 0 g();
 }
 
-.results_bulk-buttons {
+.results-bulk-buttons {
   display: flex;
   margin: g(-.25);
   flex-wrap: wrap;
@@ -59,15 +59,15 @@
   }
 }
 
-.results_bulk-selection {
+.results-bulk-selection {
   margin: 0 0 g(.5);
 }
 
-.results_count {
+.results-count {
   margin: g(.25);
 }
 
-.results_footer {
+.results-footer {
   margin-top: g(1.5);
   overflow: hidden;
   text-align: center;
@@ -97,7 +97,7 @@
   }
 }
 
-.results_header {
+.results-header {
   align-items: baseline;
   display: flex;
   flex-wrap: wrap;
@@ -121,7 +121,7 @@
   }
 }
 
-.results_list {
+.results-list {
   flex: 1;
   margin: 0 g();
 
@@ -143,7 +143,7 @@
   }
 }
 
-.results_list-actions {
+.results-list-actions {
   display: flex;
   margin: g(-.25);
   flex-wrap: wrap;
@@ -153,20 +153,20 @@
   }
 }
 
-.results_list-description {
+.results-list-description {
   max-width: none;
 }
 
-.results_pagination {
+.results-pagination {
   margin: g(.25);
   width: 100%;
 }
 
-.results_sidebar-toggle {
+.results-sidebar-toggle {
   background: $link-color;
   border: 0;
   bottom: 0;
-  color: #fff;
+  color: $white;
   font-family: text-font, sans-serif;
   font-size: $font-size-small;
   font-weight: bold;
@@ -183,7 +183,7 @@
 
   @include hover {
     background: $link-hover-color;
-    color: #fff;
+    color: $white;
   }
 
   > * {
@@ -196,7 +196,7 @@
   }
 }
 
-.results_sort {
+.results-sort {
   margin: g(.25);
   width: 100%;
 
diff --git a/themes/fid_bbi/scss/blocks/rvk.scss b/themes/fid_bbi/scss/blocks/rvk.scss
index 6726d031a22..f389208bb28 100644
--- a/themes/fid_bbi/scss/blocks/rvk.scss
+++ b/themes/fid_bbi/scss/blocks/rvk.scss
@@ -1,4 +1,4 @@
-.rvk_code {
+.rvk-code {
   background: $link-color;
   color: $white;
   display: inline-block;
@@ -12,11 +12,11 @@
 
   @include hover {
     background: $link-hover-color;
-    color: #fff;
+    color: $white;
   }
 }
 
-.rvk_label {
+.rvk-label {
   margin: 0 0 g(.5);
 
   @media #{$bp1} {
@@ -24,9 +24,16 @@
     display: flex;
     margin: 0;
   }
+
+  a[aria-expanded=true] {
+    > .icon {
+      transform: rotate(180deg);
+      padding: 0 0 0 g(.25);
+    }
+  }
 }
 
-.rvk_notation {
+.rvk-notation {
   background: $shade-weak;
   height: auto !important; // override height set by JS
   margin: 0 0 g(.75);
diff --git a/themes/fid_bbi/scss/blocks/search.scss b/themes/fid_bbi/scss/blocks/search.scss
index cc2d454d2fc..49495611674 100644
--- a/themes/fid_bbi/scss/blocks/search.scss
+++ b/themes/fid_bbi/scss/blocks/search.scss
@@ -1,5 +1,5 @@
 .search {
-  color: #fff;
+  color: $white;
   margin: 0 auto;
   max-width: $line-width - g(2);
 
@@ -22,7 +22,7 @@
   }
 }
 
-.search_form {
+.search-form {
   align-items: baseline;
   display: flex;
   flex: 1;
@@ -30,7 +30,7 @@
   position: relative;
 }
 
-.search_header {
+.search-header {
   @include off-canvas-header;
 
   @media #{$bp3} {
@@ -42,7 +42,7 @@
   }
 }
 
-.search_input {
+.search-input {
   font-family: display-font, sans-serif;
   font-size: $font-size-special;
   height: g(2);
@@ -55,27 +55,27 @@
   }
 
   &.-pad-right {
-    padding-right: g(1.75); // space for keep-filters checkbox
+    padding-right: g(1.75); // Space for keep-filters checkbox
   }
 
   .layout.-default & {
     @media #{$bp3} {
-      border-color: #fff;
+      border-color: $white;
     }
   }
 
   .layout.-home & {
-    border-color: #fff;
+    border-color: $white;
   }
 
   &::placeholder {
-    color: $color-a;
+    color: $green;
     font-weight: normal;
     opacity: 1;
   }
 }
 
-.search_keep-filters {
+.search-keep-filters {
   margin: 0 g(.5) 0 g(-2);
   position: relative;
   top: g(-.25);
@@ -132,7 +132,7 @@
   }
 }
 
-.search_links {
+.search-links {
   margin: g(.5) 0 0;
 
   ul {
@@ -157,7 +157,7 @@
 }
 
 // Only used on default layout
-.search_menu {
+.search-menu {
   margin: g() 0 0;
 
   @media #{$bp3} {
@@ -166,12 +166,12 @@
   }
 
   a {
-    // Using !importand to override `.box a`
+    // Using !important to override `.box a`
     color: $link-color !important;
     font-weight: 500 !important;
 
     @media #{$bp3} {
-      color: #fff !important;
+      color: $white !important;
       font-weight: bold !important;
     }
 
@@ -179,13 +179,13 @@
       color: $link-hover-color !important;
 
       @media #{$bp3} {
-        color: #fff !important;
+        color: $white !important;
       }
     }
   }
 }
 
-.search_submit {
+.search-submit {
   align-self: flex-start;
   display: flex;
   flex-shrink: 0;
@@ -195,7 +195,7 @@
 
   .layout.-default & {
     @media #{$bp3} {
-      color: #fff;
+      color: $white;
     }
 
     @media #{$bp5} {
@@ -205,13 +205,13 @@
 
     @include hover {
       @media #{$bp3} {
-        color: #fff;
+        color: $white;
       }
     }
   }
 
   .layout.-home & {
-    color: #fff;
+    color: $white;
 
     @media #{$bp2} {
       @include button-icon-bg(big);
@@ -220,22 +220,22 @@
 
     @include hover {
       background: $shine;
-      color: #fff;
+      color: $white;
     }
   }
 
   .icon {
-    margin: 0 g(1.25) 0 g(-.5) !important; // override margins set by button-icon-bg
+    margin: 0 g(1.25) 0 g(-.5) !important; // Override margins of button-icon-bg mixin
 
     .layout.-default & {
       @media #{$bp5} {
-        color: $color-a;
+        color: $green;
       }
     }
 
     .layout.-home & {
       @media #{$bp2} {
-        color: $color-a;
+        color: $green;
       }
     }
   }
diff --git a/themes/fid_bbi/scss/blocks/sidebar.scss b/themes/fid_bbi/scss/blocks/sidebar.scss
index 0433a1e6109..edf06f5e973 100644
--- a/themes/fid_bbi/scss/blocks/sidebar.scss
+++ b/themes/fid_bbi/scss/blocks/sidebar.scss
@@ -21,7 +21,7 @@
   }
 }
 
-.sidebar_header {
+.sidebar-header {
   @include off-canvas-header;
 
   @media #{$bp4} {
@@ -29,7 +29,7 @@
   }
 }
 
-.sidebar_inner {
+.sidebar-inner {
   max-width: $line-width;
   padding-bottom: g();
   position: relative; // For sticky sidebar
diff --git a/themes/fid_bbi/scss/blocks/sources-list.scss b/themes/fid_bbi/scss/blocks/sources-list.scss
index 35cb65e80df..2c342b619af 100644
--- a/themes/fid_bbi/scss/blocks/sources-list.scss
+++ b/themes/fid_bbi/scss/blocks/sources-list.scss
@@ -2,7 +2,7 @@
   //
 }
 
-.sources-list_list {
+.sources-list-list {
   padding: 0;
 
   h2 {
@@ -40,14 +40,14 @@
   }
 }
 
-.sources-list_toggle {
+.sources-list-toggle {
   @include button-small;
 
-  &:not(.-expanded) .sources-list_label-expanded {
+  &:not(.-expanded) .sources-list-label-expanded {
     display: none;
   }
 
-  &.-expanded .sources-list_label-collapsed {
+  &.-expanded .sources-list-label-collapsed {
     display: none;
   }
 }
diff --git a/themes/fid_bbi/scss/blocks/sr-only.scss b/themes/fid_bbi/scss/blocks/sr-only.scss
index 322a69e2378..33269d63a92 100644
--- a/themes/fid_bbi/scss/blocks/sr-only.scss
+++ b/themes/fid_bbi/scss/blocks/sr-only.scss
@@ -1,6 +1,6 @@
 .sr-only {
   position: absolute;
-  width: 1px;
+  width: 1px !important; // Fix overflow on results action buttons
   height: 1px;
   padding: 0;
   margin: -1px; // Fix for https://github.com/twbs/bootstrap/issues/25686
diff --git a/themes/fid_bbi/scss/blocks/table.scss b/themes/fid_bbi/scss/blocks/table.scss
index c423dc757ea..eda41a8cf1e 100644
--- a/themes/fid_bbi/scss/blocks/table.scss
+++ b/themes/fid_bbi/scss/blocks/table.scss
@@ -31,7 +31,7 @@
       font-size: $font-size-small;
       font-weight: bold;
       float: left;
-      transform: translateY(1px); // account for smaller font size, match baseline of content
+      transform: translateY(1px); // Account for smaller font size, match baseline of content
       min-width: g(5);
       margin-left: g(-5);
       padding-right: g(.25);
diff --git a/themes/fid_bbi/scss/blocks/tabs.scss b/themes/fid_bbi/scss/blocks/tabs.scss
index ebcfebe54f2..3659cf9dd89 100644
--- a/themes/fid_bbi/scss/blocks/tabs.scss
+++ b/themes/fid_bbi/scss/blocks/tabs.scss
@@ -2,10 +2,8 @@
   //
 }
 
-.tab-content,
-.tabs_main {
+.tab-content {
   border: 2px solid;
-  margin-bottom: -2px;
   margin-top: -2px;
 
   h2,
@@ -19,8 +17,7 @@
   }
 }
 
-.record-tab,
-.tabs_button {
+.tabs-button {
   position: relative;
   padding-left: g(1.25);
 
@@ -59,7 +56,7 @@
       box-shadow: none;
 
       @media #{$bp2} {
-        background: #fff;
+        background: $white;
         border-bottom: 0;
         border-color: $text-color;
         padding-bottom: g(.5);
@@ -68,7 +65,7 @@
   }
 }
 
-.tabs_header {
+.tabs-header {
   margin: 0;
   overflow: hidden;
   padding: 0;
@@ -93,8 +90,7 @@
   }
 }
 
-.tab-pane,
-.tabs_item {
+.tab-pane {
   display: none;
   max-width: 100%;
   overflow: auto;
diff --git a/themes/fid_bbi/scss/blocks/tagline.scss b/themes/fid_bbi/scss/blocks/tagline.scss
index 29e0d68c2a7..bd2c02108bb 100644
--- a/themes/fid_bbi/scss/blocks/tagline.scss
+++ b/themes/fid_bbi/scss/blocks/tagline.scss
@@ -1,6 +1,6 @@
 .tagline {
   clear: both;
-  color: $color-a;
+  color: $green;
   font: #{round($font-size-special * $ratio)}/#{$line-height * 1.5} display-font, sans-serif;
   margin: g(1.75) auto g(2);
   max-width: none;
diff --git a/themes/fid_bbi/scss/blocks/tags.scss b/themes/fid_bbi/scss/blocks/tags.scss
index d3f67c132f5..09b3f2b1a17 100644
--- a/themes/fid_bbi/scss/blocks/tags.scss
+++ b/themes/fid_bbi/scss/blocks/tags.scss
@@ -2,11 +2,11 @@
   //
 }
 
-.tags_button {
+.tags-button {
   border: 0;
   padding: 0;
 }
 
-.tags_form {
+.tags-form {
   display: inline;
 }
diff --git a/themes/fid_bbi/scss/blocks/to-top.scss b/themes/fid_bbi/scss/blocks/to-top.scss
index 5ce6800c5a6..289a559c862 100644
--- a/themes/fid_bbi/scss/blocks/to-top.scss
+++ b/themes/fid_bbi/scss/blocks/to-top.scss
@@ -1,9 +1,9 @@
 .to-top {
-  background: #fff;
+  background: $white;
   bottom: g(2);
   color: $text-color;
-  padding: g(.5) - 2px;
-  padding-right: g() - 2px;
+  padding: g(.25) - 2px;
+  padding-right: g(.75) - 2px;
   position: fixed;
   right: g(-.5);
   transform: skew($skew) translate(100%);
@@ -13,7 +13,7 @@
   z-index: 5;
 
   @include hover {
-    background: mix(#000, #fff, 10);
+    background: mix($black, $white, 10);
     color: $text-color;
     transition: transform $td, visibility $td;
   }
diff --git a/themes/fid_bbi/scss/blocks/toggle.scss b/themes/fid_bbi/scss/blocks/toggle.scss
new file mode 100644
index 00000000000..1f099cf86b0
--- /dev/null
+++ b/themes/fid_bbi/scss/blocks/toggle.scss
@@ -0,0 +1,30 @@
+// TODO: This file does not conform to the coding style
+
+// #17407 change text of button when expanded / collapsed
+#collapse-all-toggler:not(.expanded) .text-expanded {
+  display: none;
+}
+
+#collapse-all-toggler.expanded .text-collapsed {
+  display: none;
+}
+
+.collapse {
+  display: none;
+
+  &.in {
+    display: block;
+  }
+
+  // TODO: Can this be removed?
+  // [converter] extracted tr&.in to tr.collapse.in
+  // [converter] extracted tbody&.in to tbody.collapse.in
+}
+
+.collapsing[aria-expanded=true] {
+  display: block;
+}
+
+.collapsing[aria-expanded=false] {
+  display: none;
+}
diff --git a/themes/fid_bbi/scss/blocks/tooltip.scss b/themes/fid_bbi/scss/blocks/tooltip.scss
index 784495433c4..81a62d1cfa3 100644
--- a/themes/fid_bbi/scss/blocks/tooltip.scss
+++ b/themes/fid_bbi/scss/blocks/tooltip.scss
@@ -1,6 +1,7 @@
 .tooltip {
   background: $text-muted-color;
-  color: #fff;
+  color: $white;
+  display: block;
   font-size: $font-size-small;
   font-weight: 500;
   margin-right: g(-.25);
diff --git a/themes/fid_bbi/scss/blocks/worldcat.scss b/themes/fid_bbi/scss/blocks/worldcat.scss
new file mode 100644
index 00000000000..281f8030902
--- /dev/null
+++ b/themes/fid_bbi/scss/blocks/worldcat.scss
@@ -0,0 +1,10 @@
+// NOTE: Element name added to override .record h2
+h2.worldcat-headline {
+  font: inherit;
+  font-weight: bold;
+  margin: 0 0 g();
+}
+
+.worldcat-footer {
+  margin-top: g();
+}
diff --git a/themes/fid_bbi/scss/compiled.scss b/themes/fid_bbi/scss/compiled.scss
index a50b9e1bf8d..8bcbb1331e8 100644
--- a/themes/fid_bbi/scss/compiled.scss
+++ b/themes/fid_bbi/scss/compiled.scss
@@ -9,8 +9,8 @@
 @import 'mixins/extend-clickable-area';
 @import 'mixins/font-face';
 @import 'mixins/heading';
-@import 'mixins/hover-border';
 @import 'mixins/hover';
+@import 'mixins/hover-border';
 @import 'mixins/off-canvas';
 @import 'mixins/paragraph';
 @import 'mixins/sticky-footer';
@@ -24,10 +24,8 @@
 @import 'blocks/advanced-search';
 @import 'blocks/alert';
 @import 'blocks/badge';
-@import 'blocks/border';
 @import 'blocks/box';
 @import 'blocks/browse';
-@import 'blocks/button';
 @import 'blocks/cart';
 @import 'blocks/container';
 @import 'blocks/dropdown-menu';
@@ -40,14 +38,13 @@
 @import 'blocks/header';
 @import 'blocks/icon';
 @import 'blocks/item-list';
-@import 'blocks/link-with-icon';
 @import 'blocks/main';
 @import 'blocks/modal';
 @import 'blocks/narrow';
 @import 'blocks/nav';
 @import 'blocks/pagination';
-@import 'blocks/posts';
 @import 'blocks/post';
+@import 'blocks/posts';
 @import 'blocks/record';
 @import 'blocks/record-list';
 @import 'blocks/result';
@@ -61,10 +58,13 @@
 @import 'blocks/tabs';
 @import 'blocks/tags';
 @import 'blocks/tagline';
+@import 'blocks/toggle';
 @import 'blocks/tooltip';
 @import 'blocks/to-top';
 @import 'blocks/unstyled-list';
+@import 'blocks/worldcat';
 
 @import 'plugins/slim-select';
 
-@import 'util/hacks';
+@import 'util/print';
+@import 'util/misc';
diff --git a/themes/fid_bbi/scss/mixins/button.scss b/themes/fid_bbi/scss/mixins/button.scss
index 28d2b2251c1..b2d8d5a50de 100644
--- a/themes/fid_bbi/scss/mixins/button.scss
+++ b/themes/fid_bbi/scss/mixins/button.scss
@@ -65,12 +65,12 @@
   }
 
   .icon {
-    color: #fff;
+    color: $white;
     float: left;
     margin: 0 g(.75) 0 (g(-.5) + 1px);
 
     @if ($size == big) {
-      margin: 0 g(1.5) 0 (g(-.5) + 1px);
+      margin: 0 g(1.25) 0 (g(-.5) + 1px);
     }
 
     @if ($position == right) {
diff --git a/themes/fid_bbi/scss/mixins/off-canvas.scss b/themes/fid_bbi/scss/mixins/off-canvas.scss
index 967759d9976..9f5243f50cc 100644
--- a/themes/fid_bbi/scss/mixins/off-canvas.scss
+++ b/themes/fid_bbi/scss/mixins/off-canvas.scss
@@ -2,7 +2,7 @@
 // `position: fixed`, and we want to be able to use a fixed header.
 
 @mixin off-canvas {
-  background: #fff;
+  background: $white;
   bottom: 0;
   left: 100%;
   margin: 0;
@@ -40,7 +40,7 @@
 
 @mixin off-canvas-header {
   align-items: center;
-  background: #fff;
+  background: $white;
   box-shadow: 0 2px 0 $text-color;
   display: flex;
   justify-content: space-between;
diff --git a/themes/fid_bbi/scss/plugins/slim-select.scss b/themes/fid_bbi/scss/plugins/slim-select.scss
index 2ce36d05759..ab71cc38b38 100644
--- a/themes/fid_bbi/scss/plugins/slim-select.scss
+++ b/themes/fid_bbi/scss/plugins/slim-select.scss
@@ -22,19 +22,19 @@
 
   .ss-single-selected,
   .ss-multi-selected {
-    background: mix(#000, #fff, 5);
+    background: mix($black, $white, 5);
     border: 2px solid;
     border-radius: 0;
     padding: g(.5) - 2px;
     transition: box-shadow $td;
 
     @include hover {
-      background: #fff;
+      background: $white;
     }
 
     &.ss-open-above,
     &.ss-open-below {
-      background: #fff;
+      background: $white;
       box-shadow: 0 0 0 g(.25) $shade;
     }
 
@@ -129,7 +129,7 @@
 
       &.ss-highlighted,
       &:not(.ss-disabled):hover {
-        background: rgba($color-b, .1);
+        background: rgba($red, .1);
         color: $link-hover-color;
       }
 
diff --git a/themes/fid_bbi/scss/print.scss b/themes/fid_bbi/scss/print.scss
index 1fad3e6d222..42a2892e613 100644
--- a/themes/fid_bbi/scss/print.scss
+++ b/themes/fid_bbi/scss/print.scss
@@ -27,12 +27,12 @@
   .footer,
   .header,
   .pagination,
-  .record_access,
-  .record_links,
-  .record_sidebar,
-  .record_tabs,
-  .result_actions,
-  .results_header,
+  .record-access,
+  .record-links,
+  .record-sidebar,
+  .record-tabs,
+  .result-actions,
+  .results-header,
   .sidebar {
     display: none !important;
   }
@@ -52,7 +52,7 @@
     padding: 0;
   }
 
-  .main_wrap {
+  .main-wrap {
     width: auto;
   }
 
diff --git a/themes/fid_bbi/scss/util/fonts.scss b/themes/fid_bbi/scss/util/fonts.scss
index 6895d7c7817..f97ab5bde07 100644
--- a/themes/fid_bbi/scss/util/fonts.scss
+++ b/themes/fid_bbi/scss/util/fonts.scss
@@ -1,3 +1,5 @@
+// TODO: Preload fonts
+
 @include font-face(display-font, 'fonts/share-tech-v9-latin-regular');
 
 @include font-face(text-font, 'fonts/fira-sans-v10-latin-300');
diff --git a/themes/fid_bbi/scss/util/hacks.scss b/themes/fid_bbi/scss/util/hacks.scss
deleted file mode 100644
index b13ecc889b8..00000000000
--- a/themes/fid_bbi/scss/util/hacks.scss
+++ /dev/null
@@ -1,137 +0,0 @@
-// This file contains hacks for templates which were created for Bootstrap 3 and
-// would only require minor changes to work with the new theme, which does not
-// justify to recreate those templates. Instead, some CSS is applied to
-// Bootstrap classes.
-
-// Active links in browse lists and profile menu sidebar
-a.active {
-  color: $text-color;
-  position: relative;
-
-  // triangle marker
-  &::before {
-    // off-canvas breakpoint
-    @media #{$bp4} {
-      background: $white;
-      content: '';
-      display: block;
-      position: absolute;
-      width: 12px;
-      height: 12px;
-      border-left: 2px solid;
-      border-top: 2px solid;
-      top: 50%;
-      margin-top: -6px;
-      margin-left: g(-1) - 4.5px;
-      transform: rotate(135deg);
-    }
-  }
-}
-
-// .container must be set on .main_wrap for the create-list modal JS to work
-// but we don't want its styles
-.container.main_wrap {
-  display: block;
-}
-
-// Last row of forms, containing a "cancel" link and the submit button
-.form-group:last-child > .col-lg-11 {
-  width: 100%;
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-  flex-direction: row-reverse;
-}
-
-// .in-list is set via JS on the add-to-favorites button, fill the icon
-.in-list {
-  .icon {
-    path {
-      fill: currentColor;
-    }
-  }
-}
-
-// data-rvkNotation
-.link-with-icon[aria-expanded=true] {
-  > .icon {
-    transform: rotate(180deg);
-    padding: 0 0 0 g(.25);
-  }
-}
-
-// Togglable item list inside form
-#itemhide {
-  width: 100%;
-}
-
-.modal-loading {
-  // The FID BBI logo icon, animated
-  $svg: '<svg viewBox="0 0 45 131" width="45" height="131">
-    <style>
-      .blip {
-        stroke-dasharray: 300;
-        stroke-dashoffset: 300;
-        animation: dash 2s linear infinite;
-      }
-      @keyframes dash {
-        to { stroke-dashoffset: 0; }
-      }
-    </style>
-    <path
-      class="blip"
-      d="M 1,119.06565 43.508026,82.402623 m 0,0 L 24.117014,1.0945735 M 1,119.06615 24.117014,1.0945735 M 1,119.06615 24.117014,75.736619 43.508026,82.402623 M 24.117014,1.0945735 V 129.32465 M 1,26.862089 24.117014,32.962593 43.508026,5.0585759 M 1,26.862089 v 92.203561 l 23.117014,10.259 19.391012,-46.922027 V 5.0585759 L 24.117014,1.0945735 Z"
-      fill="none"
-      stroke="#000"
-      stroke-width="2"
-    />
-  </svg>';
-
-  background: $shine-strong svg-url($svg) center center no-repeat;
-  bottom: 0;
-  display: block;
-  left: 0;
-  position: absolute;
-  right: 0;
-  top: 0;
-  z-index: 9;
-
-  + h1,
-  + h2 {
-    margin-top: 0;
-  }
-}
-
-.get-it-box-links {
-  margin-bottom: g(.5);
-
-  &:last-child {
-    margin-bottom: 0;
-  }
-}
-
-.openurls {
-  dd {
-    margin: 0;
-  }
-
-  dt {
-    @media #{$bp3} {
-      width: g(4);
-      margin: 0;
-    }
-  }
-}
-
-.resolver-links {
-  margin-bottom: g(.5);
-}
-
-// NOTE: Must come last to override other classes
-.hidden {
-  display: none;
-}
-
-iframe#matomo {
-  width: 97.5%;
-}
\ No newline at end of file
diff --git a/themes/fid_bbi/scss/util/misc.scss b/themes/fid_bbi/scss/util/misc.scss
new file mode 100644
index 00000000000..895df996aab
--- /dev/null
+++ b/themes/fid_bbi/scss/util/misc.scss
@@ -0,0 +1,72 @@
+// This file contains styles for templates which were created for Bootstrap 3
+// and dynamically generated elements. These templates and modules would only
+// require minor changes to work with the new theme, which does not justify to
+// recreate them in the FID BBI theme, so we stick with their classes.
+
+// Active links in browse lists and profile menu sidebar
+a.active {
+  color: $text-color;
+  position: relative;
+
+  // Triangle marker
+  &::before {
+    // Off-canvas breakpoint
+    @media #{$bp4} {
+      background: $white;
+      content: '';
+      display: block;
+      position: absolute;
+      width: 12px;
+      height: 12px;
+      border-left: 2px solid;
+      border-top: 2px solid;
+      top: 50%;
+      margin-top: -6px;
+      margin-left: g(-1) - 4.5px;
+      transform: rotate(135deg);
+    }
+  }
+}
+
+.get-it-box-links {
+  margin-bottom: g(.5);
+
+  &:last-child {
+    margin-bottom: 0;
+  }
+}
+
+.help-block {
+  margin-top: g(.5);
+}
+
+.openurls {
+  dd {
+    margin: 0;
+  }
+
+  dt {
+    @media #{$bp3} {
+      width: g(4);
+      margin: 0;
+    }
+  }
+}
+
+.resolver-links {
+  margin-bottom: g(.5);
+}
+
+// NOTE: Must come last to override other classes
+.hidden {
+  display: none;
+}
+
+// Toggleable item list inside form
+#itemhide {
+  width: 100%;
+}
+
+iframe#matomo {
+  width: 97.5%;
+}
diff --git a/themes/fid_bbi/scss/util/print.scss b/themes/fid_bbi/scss/util/print.scss
new file mode 100644
index 00000000000..f3cce897bca
--- /dev/null
+++ b/themes/fid_bbi/scss/util/print.scss
@@ -0,0 +1,56 @@
+@media print {
+  * {
+    color: black !important;
+    background: none;
+    max-width: none;
+  }
+
+  html,
+  body {
+    display: block;
+    overflow: auto;
+  }
+
+  button {
+    display: none !important;
+  }
+
+  dl {
+    break-inside: avoid;
+  }
+
+  .footer,
+  .header,
+  .pagination,
+  .record-access,
+  .record-links,
+  .record-sidebar,
+  .record-tabs,
+  .result-actions,
+  .sidebar {
+    display: none !important;
+  }
+
+  .box {
+    clip-path: none !important;
+    margin-bottom: g();
+    padding: g() !important;
+
+    &::after {
+      content: none !important;
+    }
+  }
+
+  .main {
+    display: block;
+    padding: 0;
+  }
+
+  .main-wrap {
+    width: auto;
+  }
+
+  .result {
+    break-inside: avoid;
+  }
+}
diff --git a/themes/fid_bbi/scss/util/settings.scss b/themes/fid_bbi/scss/util/settings.scss
index 46e27e99c9c..fa9f953d180 100644
--- a/themes/fid_bbi/scss/util/settings.scss
+++ b/themes/fid_bbi/scss/util/settings.scss
@@ -1,33 +1,36 @@
 // Opaque colors
-$color-a: #00a376; // Green
-$color-b: #d80050; // Red
-$color-c: mix($color-a, adjust-hue($color-a, 45), 20); // Blue
-$color-d: #616971; // Gray
-
-$link-color: $color-b;
-$button-color: $color-b;
-$link-hover-color: mix(#000, $link-color, 20);
-$heading-color: $color-a;
-$text-color: #000;
-$text-muted-color: $color-d;
+$green: #00a376;
+$red: #d80050;
+$blue: mix($green, adjust-hue($green, 45), 20);
+$gray: #616971;
+$black: #000;
+$white: #fff;
 
 // Semi-opaque colors
-$button-hover-bg: rgba($color-b, .1);
-$shade-weak: rgba(#000, .05);
-$shade: rgba(#000, .1);
-$shade-strong: rgba(#000, .2);
-$shine: rgba(#fff, .1);
-$shine-strong: rgba(#fff, .6);
+$shade: rgba($black, .1);
+$shade-strong: rgba($black, .2);
+$shade-weak: rgba($black, .05);
+$shine: rgba($white, .1);
+$shine-strong: rgba($white, .6);
+
+// Semantic colors
+$button-color: $red;
+$button-hover-bg: rgba($red, .1);
+$heading-color: $green;
+$link-color: $red;
+$link-hover-color: mix($black, $link-color, 20);
+$text-color: $black;
+$text-muted-color: $gray;
 
 // Dimensions
 $grid: 28px;
-
-$font-size: 18.666666px; // $grid / 1.5
+$font-size: 18.66667px; // $grid / 1.5
 $font-size-small: 16px;
-$font-size-special: 23px; // Match small text in logo
+$font-size-special: 23px; // Matching small text in logo on large screens
 $line-height: g();
 $line-width: g(30);
 $max-width: g(48);
+$ratio: 1.425; // For typography
 
 // Breakpoints (mobile first)
 $bp1: '(min-width: 400px)';
@@ -36,11 +39,8 @@ $bp3: '(min-width: 900px)';
 $bp4: '(min-width: 1024px)';
 $bp5: '(min-width: 1346px)';
 
-// Typography
-$ratio: 1.425;
-
 // Timings
 $td: .25s; // Transition duration
 
 // Misc
-$skew: 11deg;
+$skew: 11deg; // For slanted boxes
diff --git a/themes/fid_bbi/templates/Auth/AbstractBase/login.phtml b/themes/fid_bbi/templates/Auth/AbstractBase/login.phtml
index 332b0892636..4eccb1b738b 100644
--- a/themes/fid_bbi/templates/Auth/AbstractBase/login.phtml
+++ b/themes/fid_bbi/templates/Auth/AbstractBase/login.phtml
@@ -8,19 +8,19 @@
     <input type="hidden" name="auth_method" value="<?=$account->getAuthMethod()?>">
     <input type="hidden" name="csrf" value="<?=$this->escapeHtmlAttr($account->getCsrfHash())?>">
 
-    <div class="form_footer">
+    <div class="form-footer">
       <button class="-icon" type="submit" name="processLogin">
         <?=$this->icon('login')?>
-        <?=$this->transEsc('Login')?>
+        <?=$this->translate('Login')?>
       </button>
 
-      <ul class="form_footer-links">
+      <ul class="form-footer-links">
         <?php if ($account->supportsRecovery()): ?>
           <li>
             <a
               href="<?=$this->url('myresearch-recover')?>?auth_method=<?=$account->getAuthMethod()?>"
             >
-              <?=$this->transEsc('Forgot Password')?>
+              <?=$this->translate('Forgot Password')?>
             </a>
           </li>
         <?php endif; ?>
@@ -32,7 +32,7 @@
               href="<?=$this->url('myresearch-account')?>?auth_method=<?=$account->getAuthMethod()?>"
               data-lightbox-ignore
             >
-              <?=$this->transEsc('Create New Account')?>
+              <?=$this->translate('Create Account')?>
             </a>
           </li>
         <?php endif; ?>
@@ -41,7 +41,7 @@
   </form>
 <?php else: ?>
   <a href="<?=$this->escapeHtmlAttr($sessionInitiator)?>" data-lightbox-ignore>
-    <?=$this->transEsc('Institutional Login')?>
+    <?=$this->translate('Institutional Login')?>
   </a>
 <?php endif; ?>
 <!-- fid_bbi: Auth - AbstractBase - login - END -->
diff --git a/themes/fid_bbi/templates/Recommend/SideFacets.phtml b/themes/fid_bbi/templates/Recommend/SideFacets.phtml
index 61b96cb5aa7..a7dcb29d285 100644
--- a/themes/fid_bbi/templates/Recommend/SideFacets.phtml
+++ b/themes/fid_bbi/templates/Recommend/SideFacets.phtml
@@ -58,9 +58,9 @@ $filterList = array_merge($results->getParams()->getFilterList(true), $extraFilt
     $escapedTitle = $this->escapeHtmlAttr($title);
     $isOpen = !in_array($title, $collapsedFacets);
     ?>
-    <div id="side-panel-<?=$escapedTitle?>" class="filters_filter <?=$isOpen ? '-open' : ''?>">
+    <div id="side-panel-<?=$escapedTitle?>" class="filters-filter <?=$isOpen ? '-open' : ''?>">
       <button
-        class="filters_title"
+        class="filters-title"
         type="button"
         aria-controls="side-collapse-<?=$escapedTitle?>"
         aria-expanded="<?=$isOpen ? 'true' : 'false'?>"
@@ -68,7 +68,7 @@ $filterList = array_merge($results->getParams()->getFilterList(true), $extraFilt
         <?=$this->transEsc($cluster['label'])?>
         <?=$this->icon('chevron-down')?>
       </button>
-      <div id="side-collapse-<?=$escapedTitle?>" class="facet_links -collapsed" <?=$isOpen ? '' : 'hidden'?>>
+      <div id="side-collapse-<?=$escapedTitle?>" class="facet-links -collapsed" <?=$isOpen ? '' : 'hidden'?>>
         <ol>
           <?=$this->context($this)->renderInContext('Recommend/SideFacets/facet.phtml', [
             'facet' => $title,
@@ -79,10 +79,10 @@ $filterList = array_merge($results->getParams()->getFilterList(true), $extraFilt
 
         <?php // TODO: Is there a generic way to check for non-list facets? ?>
         <?php if ($cluster['label'] !== 'adv_search_year' && count($cluster['list']) > 5): ?>
-          <button class="facet_links-toggle -expand" type="button" onclick="theme.toggleFacets()">
+          <button class="facet-links-toggle -expand" type="button" onclick="theme.toggleFacets()">
             <?=$this->transEsc('Show all')?>
           </button>
-          <button class="facet_links-toggle -collapse" type="button" onclick="theme.toggleFacets()">
+          <button class="facet-links-toggle -collapse" type="button" onclick="theme.toggleFacets()">
             <?=$this->transEsc('Show less')?>
           </button>
         <?php endif; ?>
diff --git a/themes/fid_bbi/templates/Recommend/SideFacets/filter-list.phtml b/themes/fid_bbi/templates/Recommend/SideFacets/filter-list.phtml
index ea314940cde..1a2c344fcf6 100644
--- a/themes/fid_bbi/templates/Recommend/SideFacets/filter-list.phtml
+++ b/themes/fid_bbi/templates/Recommend/SideFacets/filter-list.phtml
@@ -1,9 +1,9 @@
 <!-- fid_bbi: Recommmend - SideFacets - filter-list -->
-<div class="filters_active">
+<div class="filters-active">
   <h3><?=$this->transEsc('Active Filters')?></h3>
 
   <p class="facet -border-bottom">
-    <a class="facet_link" href="<?=$this->currentPath() . $results->getUrlQuery()->removeAllFilters()?>">
+    <a class="facet-link" href="<?=$this->currentPath() . $results->getUrlQuery()->removeAllFilters()?>">
       <?=$this->icon('x')?>
       <?=$this->transEsc('Remove all filters')?>
     </a>
@@ -32,7 +32,7 @@
         ?>
 
         <li class="facet">
-          <a class="facet_link" href="<?=$removeLink?>">
+          <a class="facet-link" href="<?=$removeLink?>">
             <?=$this->icon('x')?>
             <span class="sr-only"><?=$this->transEsc('clear_tag_filter')?></span>
             <span>
diff --git a/themes/fid_bbi/templates/Recommend/SideFacets/range-slider.phtml b/themes/fid_bbi/templates/Recommend/SideFacets/range-slider.phtml
index 9ed9c2bed4d..ce8c4a58b4c 100644
--- a/themes/fid_bbi/templates/Recommend/SideFacets/range-slider.phtml
+++ b/themes/fid_bbi/templates/Recommend/SideFacets/range-slider.phtml
@@ -12,7 +12,7 @@
       <?php // TODO: Histogram range slider ?>
     <?php endif; ?>
 
-    <div class="filters_years">
+    <div class="filters-years">
       <?php $extraInputAttr = ($this->facet['type'] === 'date') ? 'maxlength="4"' : ''; ?>
       <label>
         <span class="sr-only"><?=$this->transEsc('From the year')?></span>
diff --git a/themes/fid_bbi/templates/Recommend/SideFacets/single-facet.phtml b/themes/fid_bbi/templates/Recommend/SideFacets/single-facet.phtml
index 9929bf9372b..88e755495d0 100644
--- a/themes/fid_bbi/templates/Recommend/SideFacets/single-facet.phtml
+++ b/themes/fid_bbi/templates/Recommend/SideFacets/single-facet.phtml
@@ -24,15 +24,15 @@ if (!empty($this->facet['displayText'])) {
 ?>
 
 <li class="facet">
-  <a class="facet_link" href="<?=$facetUrl?>">
-    <span class="sr-only"><?=$this->transEsc('Add filter')?></span>
-    <span class="facet_plus <?=$this->facet['isApplied'] ? '-selected' : ''?>">+</span>
-    <span class="facet_text"><?=$text?></span>
-    <span class="facet_badge"><?=$this->localizedNumber($this->facet['count'])?></span>
+  <a class="facet-link" href="<?=$facetUrl?>">
+    <span class="sr-only"><?=$this->transEsc('Add filter:')?></span>
+    <span class="facet-plus <?=$this->facet['isApplied'] ? '-selected' : ''?>">+</span>
+    <span class="facet-text"><?=$text?></span>
+    <span class="facet-badge"><?=$this->localizedNumber($this->facet['count'])?></span>
   </a>
-  <a class="facet_link" href="<?=$facetExcludeUrl?>">
-    <span class="facet_minus">-</span>
-    <div class="tooltip"><?=$this->translate('add_filter_not', ['%%text%%' => $text])?></div>
+  <a class="facet-link" href="<?=$facetExcludeUrl?>">
+    <span class="facet-minus">-</span>
+    <span class="tooltip"><?=$this->translate('add_filter_not', ['%%text%%' => $text])?></span>
   </a>
 </li>
 <!-- fid_bbi: Recommmend - SideFacets - single-facet - END -->
diff --git a/themes/fid_bbi/templates/RecordDriver/DefaultRecord/core.phtml b/themes/fid_bbi/templates/RecordDriver/DefaultRecord/core.phtml
index 125535bbbd7..43b755c7955 100644
--- a/themes/fid_bbi/templates/RecordDriver/DefaultRecord/core.phtml
+++ b/themes/fid_bbi/templates/RecordDriver/DefaultRecord/core.phtml
@@ -1,11 +1,11 @@
 <!-- fid_bbi: RecordDriver - DefaultRecord - core -->
 <div
-  class="record_main"
+  class="record-main"
   vocab="http://schema.org/"
   resource="#record"
   typeof="<?=$this->driver->getSchemaOrgFormats()?> Product"
 >
-  <div class="record_type">
+  <div class="record-type">
     <?php
     $format = ($this->driver->tryMethod('getFormats') ?? ['Unknown format'])[0];
     $formatIconMappingsFile = APPLICATION_PATH . '/themes/fid_bbi/format-icon-mappings.json';
@@ -18,7 +18,7 @@
       <?=$this->icon('media/unknown')?>
     <?php endif; ?>
   </div>
-  <div class="record_header">
+  <div class="record-header">
     <?php
     // finc: We want to get rid of trailing special chars in the title and
     // limit its length to 100 chars; in finc: keep schema name tag here!!
@@ -61,15 +61,15 @@
 </div>
 
 <div class="box -left">
-  <div class="record_access">
+  <div class="record-access">
     <h2><?=$this->translate('Access')?></h2>
-    <div class="record_holdingsils">
+    <div class="record-holdingsils">
       <?=$this->context($this)->renderInContext('RecordTab/holdingsils.phtml',[])?>
     </div>
   </div>
 </div>
 
-<ul class="record_links">
+<ul class="record-links">
   <li>
     <?php
     $permalink = $this->url(
@@ -79,7 +79,7 @@
     );
     ?>
     <a
-      class="link-with-icon"
+      class="-icon"
       id="permalink"
       href="<?=$permalink?>"
     >
@@ -90,7 +90,7 @@
 
   <li>
     <a
-      class="link-with-icon"
+      class="-icon"
       data-lightbox
       href="<?=$this->recordLink()->getActionUrl($this->driver, 'Acquisition')?>"
       rel="nofollow"
@@ -103,7 +103,7 @@
   <?php if($this->record($this->driver)->allowDigitizationOnDemand()): ?>
     <li>
       <a
-        class="link-with-icon"
+        class="-icon"
         data-lightbox
         href="<?=$this->recordLink()->getActionUrl($this->driver, 'fidDigitization')?>"
         rel="nofollow"
@@ -116,7 +116,7 @@
 
   <li>
     <a
-      class="link-with-icon"
+      class="-icon"
       data-lightbox
       href="<?=$this->recordLink()->getActionUrl($this->driver, 'ReportErrors')?>"
       rel="nofollow"
diff --git a/themes/fid_bbi/templates/RecordDriver/DefaultRecord/data-rvkNotation.phtml b/themes/fid_bbi/templates/RecordDriver/DefaultRecord/data-rvkNotation.phtml
index 29fb30f4c0d..16fd2651cba 100644
--- a/themes/fid_bbi/templates/RecordDriver/DefaultRecord/data-rvkNotation.phtml
+++ b/themes/fid_bbi/templates/RecordDriver/DefaultRecord/data-rvkNotation.phtml
@@ -14,9 +14,9 @@
 
 <?php // partial copied from themes/finc/templates/RecordTab/topics.phtml ?>
 <?php foreach ($data as $index => $item): ?>
-  <div class="rvk_label">
+  <div class="rvk-label">
     <div>
-      <a class="rvk_code" href="<?=$this->record($this->driver)->getLink('rvk', $item['rvk'])?>">
+      <a class="rvk-code" href="<?=$this->record($this->driver)->getLink('rvk', $item['rvk'])?>">
         <?=$item['rvk']?>
       </a>
     </div>
@@ -24,7 +24,7 @@
     <?php if (isset($item['name'])): ?>
       <div>
         <a
-          class="toggle link-with-icon"
+          class="toggle -icon"
           role="button"
           data-toggle="collapse"
           href="#collapse_rvk_<?=$index?>"
@@ -38,7 +38,7 @@
   </div>
 
   <?php if (isset($item['level']) && is_array($item['level'])): ?>
-    <div id="collapse_rvk_<?=$index?>" class="collapse notation rvk_notation">
+    <div id="collapse_rvk_<?=$index?>" class="collapse notation rvk-notation">
       <?=$this->render('Helpers/nestedList.phtml', ['array' => $item['level']])?>
     </div>
   <?php endif; ?>
diff --git a/themes/fid_bbi/templates/RecordDriver/DefaultRecord/list-entry.phtml b/themes/fid_bbi/templates/RecordDriver/DefaultRecord/list-entry.phtml
index a9c2d072858..d6cd9ddcddf 100644
--- a/themes/fid_bbi/templates/RecordDriver/DefaultRecord/list-entry.phtml
+++ b/themes/fid_bbi/templates/RecordDriver/DefaultRecord/list-entry.phtml
@@ -37,12 +37,12 @@ $icon = $formatIconMappings[$format] ?? 'unknown';
   <input type="hidden" value="<?=$this->escapeHtmlAttr($id)?>" class="hiddenId"/>
   <input type="hidden" value="<?=$this->escapeHtmlAttr($source)?>" class="hiddenSource"/>
 
-  <div class="result_checkbox">
+  <div class="result-checkbox">
     <?=$this->record($this->driver)->getCheckbox()?>
   </div>
 
-  <div class="result_details">
-    <h3 class="result_title resultItemLine1">
+  <div class="result-details">
+    <h3 class="result-title resultItemLine1">
       <?php $missing = $this->driver instanceof \VuFind\RecordDriver\Missing; ?>
       <?php $describedById = $driver->getSourceIdentifier() . '|' . $driver->getUniqueId(); ?>
       <?php if (!$missing): ?>
@@ -59,7 +59,7 @@ $icon = $formatIconMappings[$format] ?? 'unknown';
       <?php endif; ?>
     </h3>
 
-    <div class="result_subtitle">
+    <div class="result-subtitle">
       <?php $subtitle = $this->record($this->driver)->getSubTitleHtml(6); ?>
       <?php if (!empty($subtitle)): ?>
         <?=$subtitle?>
@@ -72,7 +72,7 @@ $icon = $formatIconMappings[$format] ?? 'unknown';
       <?php else: ?>
         <?php $summAuthors = $this->driver->getPrimaryAuthors(); ?>
         <?php if (!empty($summAuthors)): ?>
-          <div class="result_author">
+          <div class="result-author">
             <?php $authorCount = count($summAuthors);
             foreach ($summAuthors as $i => $summAuthor): ?>
               <a href="<?=$this->record($this->driver)->getLink('author', $summAuthor)?>">
@@ -100,7 +100,7 @@ $icon = $formatIconMappings[$format] ?? 'unknown';
             <?php endif; ?>
           </div>
         <?php elseif (!empty($summDate)): ?>
-          <div class="result_place">
+          <div class="result-place">
             <?=$this->transEsc('Published') . ' ' . $this->escapeHtml($summDate[0])?>
           </div>
         <?php endif; ?>
@@ -215,7 +215,7 @@ $icon = $formatIconMappings[$format] ?? 'unknown';
         <?php endif; ?>
       <?php endif; ?>
 
-      <div class="result_media">
+      <div class="result-media">
         <?=$this->record($this->driver)->getFormatList()?>
       </div>
 
@@ -247,7 +247,7 @@ $icon = $formatIconMappings[$format] ?? 'unknown';
     <?php endif; ?>
   </div>
 
-  <div class="result_actions">
+  <div class="result-actions">
     <?php
     // finc: next line finc-specific; required to display public favorites
     // lists, #12052, see also above - CK
@@ -258,9 +258,9 @@ $icon = $formatIconMappings[$format] ?? 'unknown';
         class="edit tool"
       >
         <?=$this->icon('pen')?>
-        <div class="tooltip">
+        <span class="tooltip">
           <?=$this->transEsc('Edit')?>
-        </div>
+        </span>
       </a>
 
       <?php
@@ -275,9 +275,9 @@ $icon = $formatIconMappings[$format] ?? 'unknown';
       <div class="dropdown">
         <a class="dropdown-toggle" id="<?=$dLabel?>" role="button" data-toggle="dropdown" href="<?=$deleteUrlGet?>">
           <?=$this->icon('trash')?>
-          <div class="tooltip">
+          <span class="tooltip">
             <?=$this->transEsc('Delete')?>
-          </div>
+          </span>
         </a>
 
         <ul class="dropdown-menu" role="menu" aria-labelledby="<?=$dLabel?>">
diff --git a/themes/fid_bbi/templates/RecordDriver/DefaultRecord/result-list.phtml b/themes/fid_bbi/templates/RecordDriver/DefaultRecord/result-list.phtml
index 17293b2c3f9..9e03fd6084e 100644
--- a/themes/fid_bbi/templates/RecordDriver/DefaultRecord/result-list.phtml
+++ b/themes/fid_bbi/templates/RecordDriver/DefaultRecord/result-list.phtml
@@ -12,14 +12,14 @@ $icon = $this->record($this->driver)->getIconMapping($format);
 <input type="hidden" value="<?=$this->escapeHtmlAttr($this->driver->getUniqueID())?>" class="hiddenId">
 <input type="hidden" value="<?=$this->escapeHtmlAttr($this->driver->getSourceIdentifier())?>" class="hiddenSource">
 
-<div class="result_type">
+<div class="result-type">
   <?=$this->icon("media/$icon")?>
 </div>
 
-<div class="result_details">
+<div class="result-details">
   <a
     href="<?=$this->recordLink()->getUrl($this->driver)?>"
-    class="result_link title getFull"
+    class="result-link title getFull"
     data-view="<?=$this->params->getOptions()->getListViewOption()?>"
   >
     <h3>
@@ -29,10 +29,10 @@ $icon = $this->record($this->driver)->getIconMapping($format);
   </a>
 
   <?php if (!empty($subtitle)): ?>
-    <div class="result_subtitle"><?=trim($subtitle, ': ')?></div>
+    <div class="result-subtitle"><?=trim($subtitle, ': ')?></div>
   <?php endif; ?>
 
-  <div class="result_author">
+  <div class="result-author">
     <?php if ($this->driver->isCollection()): ?>
       <?=implode('<br>', array_map([$this, 'escapeHtml'], $this->driver->getSummary())); ?>
     <?php else: ?>
@@ -79,7 +79,7 @@ $icon = $this->record($this->driver)->getIconMapping($format);
     <?php endif; ?>
   </div>
 
-  <div class="result_collection">
+  <div class="result-collection">
     <?php if ($this->driver->isCollection()): ?>
       <?=implode('<br>', array_map([$this, 'escapeHtml'], $this->driver->getSummary())); ?>
     <?php else: ?>
@@ -109,16 +109,16 @@ $icon = $this->record($this->driver)->getIconMapping($format);
     <?php endif; ?>
   </div>
 
-  <div class="result_place">
+  <div class="result-place">
     <?php $imprintLines = (array)$this->driver->tryMethod('getImprint'); ?>
     <?=!empty($imprintLines) ? $imprintLines[0] : ''?>
   </div>
 
-  <div class="result_media">
+  <div class="result-media">
     <?=$this->translate($format)?>
   </div>
 
-  <div class="result_source">
+  <div class="result-source">
     <?php $collection = $this->driver->tryMethod('getMegaCollection'); ?>
     <?=!empty($collection) && (empty($imprintLines) || $collection[0] !== $imprintLines[0]) ? $collection[0] : ''?>
   </div>
@@ -158,7 +158,7 @@ $icon = $this->record($this->driver)->getIconMapping($format);
   <?php endif; ?>
 </div>
 
-<div class="result_actions">
+<div class="result-actions">
   <?php
   $isCartActive = $this->cart()->isActiveInSearch()
     && $this->params->getOptions()->supportsCart()
@@ -182,9 +182,9 @@ $icon = $this->record($this->driver)->getIconMapping($format);
         data-id="<?=$this->escapeHtmlAttr($this->driver->getUniqueId())?>"
       >
         <?=$this->icon('star')?>
-        <div class="tooltip">
+        <span class="tooltip">
           <?=$this->transEsc('Add to favorites')?>
-        </div>
+        </span>
       </a>
     <?php elseif ($block = $this->permission()->getAlternateContent('feature.Favorites')): ?>
       <?=$block?>
diff --git a/themes/fid_bbi/templates/RecordDriver/DefaultRecord/toolbar.phtml b/themes/fid_bbi/templates/RecordDriver/DefaultRecord/toolbar.phtml
index d45f7117e2c..cc42c4e192d 100644
--- a/themes/fid_bbi/templates/RecordDriver/DefaultRecord/toolbar.phtml
+++ b/themes/fid_bbi/templates/RecordDriver/DefaultRecord/toolbar.phtml
@@ -10,9 +10,9 @@ $cart = $this->cart();
 $cartId = $this->driver->getSourceIdentifier() . '|' . $this->driver->getUniqueId();
 ?>
 
-<div class="record_sidebar">
+<div class="record-sidebar">
   <h2 class="sr-only"><?=$this->transEsc('Toolbar')?></h2>
-  <div class="record_actions -primary">
+  <div class="record-actions -primary">
     <?php
     $cart = $this->cart();
     $id = $this->driver->getUniqueId();
@@ -21,15 +21,15 @@ $cartId = $this->driver->getSourceIdentifier() . '|' . $this->driver->getUniqueI
     <?php if ($cart->isActive()): ?>
       <?php $cartId = $source . '|' . $id; ?>
       <div
-        class="record_action-group btn-bookbag-toggle"
+        class="record-action-group btn-bookbag-toggle"
         data-cart-id="<?=$this->escapeHtmlAttr($id)?>"
         data-cart-source="<?=$this->escapeHtmlAttr($source)?>"
       >
-        <a class="record_action cart-add hidden" href="javascript:;">
+        <a class="record-action cart-add hidden" href="javascript:;">
           <?=$this->icon('pin')?>
           <?=$this->transEsc('Add to Book Bag')?>
         </a>
-        <a class="record_action cart-remove hidden" href="javascript:;">
+        <a class="record-action cart-remove hidden" href="javascript:;">
           <?=$this->icon('pin', 'icon -beat')?>
           <?=$this->transEsc('Remove from Book Bag')?>
         </a>
@@ -38,7 +38,7 @@ $cartId = $this->driver->getSourceIdentifier() . '|' . $this->driver->getUniqueI
 
     <?php if ($this->permission()->allowDisplay('feature.Favorites')): ?>
       <a
-        class="record_action"
+        class="record-action"
         data-lightbox
         href="<?=$this->recordLink()->getActionUrl($this->driver, 'Save')?>"
         title="<?=$this->transEsc('Add to favorites')?>"
@@ -52,9 +52,9 @@ $cartId = $this->driver->getSourceIdentifier() . '|' . $this->driver->getUniqueI
     <?php endif; ?>
   </div>
 
-  <div class="record_actions -secondary">
+  <div class="record-actions -secondary">
     <a
-      class="record_action"
+      class="record-action"
       data-lightbox
       href="<?=$this->recordLink()->getActionUrl($this->driver, 'Cite')?>"
       rel="nofollow"
@@ -75,12 +75,11 @@ $cartId = $this->driver->getSourceIdentifier() . '|' . $this->driver->getUniqueI
 
     <?php $exportFormats = $this->export()->getFormatsForRecord($this->driver); ?>
     <?php if (count($exportFormats) > 0): ?>
-      <!-- TODO: ARIA -->
-      <a class="record_action dropdown-toggle" href="javascript:;" role="button" data-toggle="dropdown">
+      <?php // TODO: ARIA ?>
+      <a class="record-action dropdown-toggle" href="javascript:;" role="button" data-toggle="dropdown">
         <?=$this->icon('download')?>
         <?=$this->transEsc('Export')?>
       </a>
-      <!-- TODO: Dropdown -->
       <ul class="dropdown-menu -right" role="menu">
         <?php foreach ($exportFormats as $exportFormat): ?>
           <li>
@@ -93,7 +92,7 @@ $cartId = $this->driver->getSourceIdentifier() . '|' . $this->driver->getUniqueI
     <?php endif; ?>
 
     <a
-      class="record_action"
+      class="record-action"
       data-lightbox
       href="<?=$this->recordLink()->getActionUrl($this->driver, 'Email')?>"
       rel="nofollow"
@@ -102,7 +101,7 @@ $cartId = $this->driver->getSourceIdentifier() . '|' . $this->driver->getUniqueI
       <?=$this->transEsc('Email this')?>
     </a>
 
-    <a class="record_action" href="javascript:window.print()">
+    <a class="record-action" href="javascript:window.print()">
       <?=$this->icon('printer')?>
       <?=$this->transEsc('Print')?>
     </a>
diff --git a/themes/fid_bbi/templates/RecordTab/holdingsils.phtml b/themes/fid_bbi/templates/RecordTab/holdingsils.phtml
index 9b10e8a1f0e..b83323fdee9 100644
--- a/themes/fid_bbi/templates/RecordTab/holdingsils.phtml
+++ b/themes/fid_bbi/templates/RecordTab/holdingsils.phtml
@@ -27,7 +27,7 @@ $isFree = in_array('Free', $this->driver->tryMethod('getFacetAvail'));
   <?php endif; ?>
 <?php endif; ?>
 
-<div class="record_getitbox">
+<div class="record-getitbox">
   <?php if ($user && $getitConfig['bossData']): ?>
     <div class="boss-data-true"></div>
   <?php endif; ?>
@@ -87,7 +87,7 @@ $isFree = in_array('Free', $this->driver->tryMethod('getFacetAvail'));
   <ul class="unstyled-list">
     <?php foreach ($onlineUrls as $current): ?>
       <li>
-        <a class="link-with-icon" href="<?=$this->escapeHtmlAttr($this->proxyUrl($current['link']))?>">
+        <a class="-icon" href="<?=$this->escapeHtmlAttr($this->proxyUrl($current['link']))?>">
           <?=$this->icon('external-link')?>
           <?=$this->escapeHtml($current['text'])?>
         </a>
diff --git a/themes/fid_bbi/templates/RecordTab/worldcat.phtml b/themes/fid_bbi/templates/RecordTab/worldcat.phtml
index 5d19853edbe..33e52c8f6c5 100644
--- a/themes/fid_bbi/templates/RecordTab/worldcat.phtml
+++ b/themes/fid_bbi/templates/RecordTab/worldcat.phtml
@@ -1,5 +1,5 @@
 <!-- fid_bbi: recordtab - worldcat -->
-<? $script = <<<JS
+<?php $script = <<<JS
   $(document).ready(function() {
     var recordId = $('.hiddenId').val();
     var recordSource = $('.hiddenSource').val();
@@ -18,16 +18,18 @@ JS;
 ?>
 <?=$this->inlineScript(\Zend\View\Helper\HeadScript::SCRIPT, $script, 'SET');?>
 
-<div class="worldcat-headline" style="display: none"><?=$this->translate('worldcat_availability')?></div>
+<h2 class="worldcat-headline" style="display: none"><?=$this->translate('worldcat_availability')?></h2>
 <div class="worldcat-data"></div>
 
 <?php
 // #16470: build link with oclc number - GG
 $oclc = $this->driver->tryMethod('getOCLC');
-if (!empty($oclc)): ?>
-  <p>
+?>
+<?php if (!empty($oclc)): ?>
+  <p class="worldcat-footer">
     <?php $url = sprintf('https://www.worldcat.org/oclc/%s', $oclc[0]); ?>
-    <?=$this->externalLink($url, $this->translate('Link to WorldCat record'))?>
+    <?php $linkText = $this->icon('external-link') . $this->translate('Link to WorldCat record'); ?>
+    <?=$this->externalLink($url, $linkText, ['class' => '-icon'])?>
   </p>
 <?php endif; ?>
 <!-- fid_bbi: recordtab - worldcat - END -->
diff --git a/themes/fid_bbi/templates/ajax/boss-false.phtml b/themes/fid_bbi/templates/ajax/boss-false.phtml
index 2fbed6b90a5..114383cf479 100644
--- a/themes/fid_bbi/templates/ajax/boss-false.phtml
+++ b/themes/fid_bbi/templates/ajax/boss-false.phtml
@@ -19,7 +19,7 @@
       <?php endif; ?>
       <?php if ($this->isAddNetwork): ?>
         <?php $linkText = $this->icon('external-link') . $this->translate('boss_holding'); ?>
-        <?=$this->externalLink($this->url, $iconHtml . $linkText, ['class' => 'link-with-icon'])?>
+        <?=$this->externalLink($this->url, $iconHtml . $linkText, ['class' => '-icon'])?>
         <br>
         <a href="<?=$this->url('content-page', ['page' => 'networknotice'])?>" data-lightbox>
           <?=$this->translate('boss_note')?>
diff --git a/themes/fid_bbi/templates/ajax/boss-true.phtml b/themes/fid_bbi/templates/ajax/boss-true.phtml
index 83ccd827d36..3742f7a398d 100644
--- a/themes/fid_bbi/templates/ajax/boss-true.phtml
+++ b/themes/fid_bbi/templates/ajax/boss-true.phtml
@@ -15,7 +15,7 @@
   <?php else: ?>
     <?php if ($this->isISXNZBD): ?>
       <?php $linkText = $this->icon('external-link') . $this->transEsc('boss_true'); ?>
-      <?=$this->externalLink($this->url, $linkText, ['class' => 'link-with-icon'])?>
+      <?=$this->externalLink($this->url, $linkText, ['class' => '-icon'])?>
       <?php if (!empty($this->callnumber)): ?>
         <br>
         <span class="pda-part-text">
diff --git a/themes/fid_bbi/templates/ajax/resolverLinks.phtml b/themes/fid_bbi/templates/ajax/resolverLinks.phtml
index 8c5dcf5805d..bf81f36a022 100644
--- a/themes/fid_bbi/templates/ajax/resolverLinks.phtml
+++ b/themes/fid_bbi/templates/ajax/resolverLinks.phtml
@@ -38,7 +38,7 @@ $links = array_filter($this->electronic ?? [], function ($link) use (&$hrefs) {
             }
 
             $linkAttr = [
-              'class' => 'link-with-icon' . (!empty($link['access']) ? ' access-' . $link['access'] : ''),
+              'class' => '-icon' . (!empty($link['access']) ? ' access-' . $link['access'] : ''),
               'title' => $this->escapeHtmlAttr($link['service_type'] ?? ''),
             ];
             ?>
diff --git a/themes/fid_bbi/templates/amsl/sources-list.phtml b/themes/fid_bbi/templates/amsl/sources-list.phtml
index d25f48b7524..b9859223514 100644
--- a/themes/fid_bbi/templates/amsl/sources-list.phtml
+++ b/themes/fid_bbi/templates/amsl/sources-list.phtml
@@ -34,13 +34,13 @@ if (isset($this->rendered_html)) {
 
     <p>
       <?php // TODO: Add ARIA attributes? ?>
-      <button id="sources-list-toggle-all" class="sources-list_toggle">
-        <span class="sources-list_label-collapsed"><?=$this->transEsc('Expand all')?></span>
-        <span class="sources-list_label-expanded"><?=$this->transEsc('Collapse all')?></span>
+      <button id="sources-list-toggle-all" class="sources-list-toggle">
+        <span class="sources-list-label-collapsed"><?=$this->transEsc('Expand all')?></span>
+        <span class="sources-list-label-expanded"><?=$this->transEsc('Collapse all')?></span>
       </button>
     </p>
 
-    <ul id="sources-list" class="sources-list_list">
+    <ul id="sources-list" class="sources-list-list">
       <?php $counter = 0; ?>
       <?php foreach ($this->sources as $label => $source): ?>
         <?php if (!empty($source)): ?>
@@ -48,7 +48,7 @@ if (isset($this->rendered_html)) {
           <li>
             <h2>
               <button
-                class="filters_title"
+                class="filters-title"
                 type="button"
                 aria-controls="sources-item-<?=$counter?>"
                 aria-expanded="false"
diff --git a/themes/fid_bbi/templates/content/faq-en.phtml b/themes/fid_bbi/templates/content/faq-en.phtml
index b41329a2981..2fb47062b6a 100644
--- a/themes/fid_bbi/templates/content/faq-en.phtml
+++ b/themes/fid_bbi/templates/content/faq-en.phtml
@@ -9,7 +9,7 @@ $account = $this->auth()->getManager();
 <h2 id="contact">Contact</h2>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="contact-1" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="contact-1" aria-expanded="false">
     How can I keep me updated about the FID BBI?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -19,7 +19,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="contact-2" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="contact-2" aria-expanded="false">
     Who can I contact with questions and suggestions?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -29,7 +29,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="contact-3" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="contact-3" aria-expanded="false">
     How can I unsubscribe from the mailing list?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -41,7 +41,7 @@ $account = $this->auth()->getManager();
 <h2>Registration and user account</h2>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="account-1" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="account-1" aria-expanded="false">
     How do I create a user account?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -52,7 +52,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="account-2" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="account-2" aria-expanded="false">
     Do I have to register to use the FID BBI portal?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -62,7 +62,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="account-3" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="account-3" aria-expanded="false">
     Why should I create an user account in the FID BBI portal?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -72,7 +72,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="account-4" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="account-4" aria-expanded="false">
     Why should I define a home library?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -83,7 +83,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="account-5" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="account-5" aria-expanded="false">
     How do I change my personal data?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -93,7 +93,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="account-6" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="account-6" aria-expanded="false">
     What do I do if I forget my password?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -103,7 +103,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="account-7" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="account-7" aria-expanded="false">
     How can I change my password?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -113,7 +113,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="account-8" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="account-8" aria-expanded="false">
     How can I change my email address?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -125,7 +125,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="account-9" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="account-9" aria-expanded="false">
     Are my data secure?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -138,7 +138,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="account-10" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="account-10" aria-expanded="false">
     How do I delete my account?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -151,7 +151,7 @@ $account = $this->auth()->getManager();
 <h2>User groups</h2>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="groups-1" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="groups-1" aria-expanded="false">
     What are user groups?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -161,7 +161,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="groups-2" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="groups-2" aria-expanded="false">
     What additional services are available for working professionals active in research?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -171,7 +171,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="groups-3" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="groups-3" aria-expanded="false">
     What additional services are available for researchers?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -181,7 +181,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="groups-4" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="groups-4" aria-expanded="false">
     How do I change my user group?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -193,7 +193,7 @@ $account = $this->auth()->getManager();
 <h2>Research and access to literature</h2>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="search-1" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="search-1" aria-expanded="false">
     What can I research in the BBI portal?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -208,7 +208,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="search-2" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="search-2" aria-expanded="false">
     How do I search in the BBI portal?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -218,7 +218,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="search-3" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="search-3" aria-expanded="false">
     How can I narrow down my results list?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -248,7 +248,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="search-4" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="search-4" aria-expanded="false">
     What can I find under “Further research entries”?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -258,7 +258,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="search-5" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="search-5" aria-expanded="false">
     Can I initiate an interlibrary loan directly from the portal?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -268,7 +268,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="search-6" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="search-6" aria-expanded="false">
     What is the Digitization-on-Demand service and how does it work?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -280,7 +280,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="search-7" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="search-7" aria-expanded="false">
     Can I also make acquisition suggestions?
     <?=$this->icon('chevron-down')?>
   </button>
diff --git a/themes/fid_bbi/templates/content/faq.phtml b/themes/fid_bbi/templates/content/faq.phtml
index 64c29479baf..a5fd6c41e17 100644
--- a/themes/fid_bbi/templates/content/faq.phtml
+++ b/themes/fid_bbi/templates/content/faq.phtml
@@ -9,7 +9,7 @@ $account = $this->auth()->getManager();
 <h2 id="contact">Kontakt</h2>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="contact-1" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="contact-1" aria-expanded="false">
     Wie kann ich mich über den FID BBI auf dem Laufenden halten?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -19,7 +19,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="contact-2" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="contact-2" aria-expanded="false">
     An wen kann ich mich mit Fragen und Anregungen wenden?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -29,7 +29,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="contact-3" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="contact-3" aria-expanded="false">
     Wie kann ich mich von der Mailingliste abmelden?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -41,7 +41,7 @@ $account = $this->auth()->getManager();
 <h2 id="account">Registrierung und Konto</h2>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="account-1" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="account-1" aria-expanded="false">
     Wie lege ich ein Nutzerkonto an?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -52,7 +52,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="account-2" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="account-2" aria-expanded="false">
     Muss ich mich anmelden, um das Portal des FID BBI nutzen zu können?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -62,7 +62,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="account-3" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="account-3" aria-expanded="false">
     Warum sollte ich mir im Portal des FID BBI ein Konto erstellen?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -72,7 +72,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="account-4" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="account-4" aria-expanded="false">
     Warum sollte ich eine Heimatbibliothek angeben?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -83,7 +83,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="account-5" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="account-5" aria-expanded="false">
     Wie ändere ich meine persönlichen Angaben?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -93,7 +93,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="account-6" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="account-6" aria-expanded="false">
     Was mache ich, wenn ich mein Passwort vergessen habe?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -103,7 +103,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="account-8" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="account-8" aria-expanded="false">
     Wie kann ich mein Passwort ändern?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -113,7 +113,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="account-9" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="account-9" aria-expanded="false">
     Wie kann ich meine E-Mail-Adresse ändern?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -125,7 +125,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="account-10" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="account-10" aria-expanded="false">
     Sind meine Daten sicher?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -138,7 +138,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="account-11" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="account-11" aria-expanded="false">
     Wie lösche ich mein Konto?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -151,7 +151,7 @@ $account = $this->auth()->getManager();
 <h2 id="groups">Nutzergruppen</h2>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="groups-1" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="groups-1" aria-expanded="false">
     Was sind Nutzergruppen?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -161,7 +161,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="groups-2" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="groups-2" aria-expanded="false">
     Welche Zusatzdienstleistungen gibt es für in der Forschung aktive Berufspraktiker*innen?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -171,7 +171,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="groups-3" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="groups-3" aria-expanded="false">
     Welche Zusatzdienstleistungen gibt es für Forschende?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -181,7 +181,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="groups-4" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="groups-4" aria-expanded="false">
     Wie ändere ich meine Nutzergruppe?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -193,7 +193,7 @@ $account = $this->auth()->getManager();
 <h2>Recherche und Zugang zu Literatur</h2>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="search-1" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="search-1" aria-expanded="false">
     Was kann ich im BBI-Portal recherchieren?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -208,7 +208,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="search-2" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="search-2" aria-expanded="false">
     Wie suche ich im BBI-Portal?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -218,7 +218,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="search-3" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="search-3" aria-expanded="false">
     Wie kann ich meine Ergebnisliste eingrenzen?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -250,7 +250,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="search-4" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="search-4" aria-expanded="false">
     Was finde ich unter „Weitere Rechercheeinstiege“?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -260,7 +260,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="search-5" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="search-5" aria-expanded="false">
     Kann ich direkt aus dem Portal eine Fernleihe auslösen?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -270,7 +270,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="search-6" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="search-6" aria-expanded="false">
     Was ist der Digitization-on-Demand-Service und wie funktioniert er?
     <?=$this->icon('chevron-down')?>
   </button>
@@ -282,7 +282,7 @@ $account = $this->auth()->getManager();
 </div>
 
 <h3>
-  <button class="filters_title" type="button" aria-controls="search-7" aria-expanded="false">
+  <button class="filters-title" type="button" aria-controls="search-7" aria-expanded="false">
     Kann ich auch Anschaffungsvorschläge machen?
     <?=$this->icon('chevron-down')?>
   </button>
diff --git a/themes/fid_bbi/templates/fid/user/create.phtml b/themes/fid_bbi/templates/fid/user/create.phtml
index 1cda500031a..5f8c87c4d8e 100644
--- a/themes/fid_bbi/templates/fid/user/create.phtml
+++ b/themes/fid_bbi/templates/fid/user/create.phtml
@@ -169,11 +169,11 @@ $elemHomeLibrary->setAttributes(['class' => 'form-control']);
 $elemJobTitle = $form->get('job_title');
 ?>
 <div class="form-group">
-    <div class="form_label" id="job-title-legend">
+    <div class="form-label" id="job-title-legend">
         <?=$this->translate("fid::{$elemJobTitle->getLabel()}")?>
         <span class="required" title="benötigt" aria-label="benötigt"></span>
     </div>
-    <div class="form_control" aria-labelledby="job-title-legend">
+    <div class="form-inputs" aria-labelledby="job-title-legend">
         <p><?=$this->translate("fid::{$elemJobTitle->getName()}")?>:</p>
         <?=$this->formRadio($elemJobTitle)?>
     </div>
diff --git a/themes/fid_bbi/templates/finc/dbis/result.phtml b/themes/fid_bbi/templates/finc/dbis/result.phtml
index e5325863777..a2f539f3db6 100644
--- a/themes/fid_bbi/templates/finc/dbis/result.phtml
+++ b/themes/fid_bbi/templates/finc/dbis/result.phtml
@@ -38,7 +38,7 @@
   <?php /** @var finc\Dbis\Model\View\Group $group */ ?>
   <?php foreach ($this->result as $group): ?>
     <h3><?=$this->translate('Dbis ' . $group->getName())?></h3>
-    <ul class="dbis_list">
+    <ul class="dbis-list">
       <?php foreach ($group as $item): ?>
         <li>
           <span
@@ -49,7 +49,7 @@
               data-html="true"
               title="<?=$accessLabels[$accessRef]?>"
             <?php endif; ?>
-            class="dbis_icon dbis-list-accessinfo-<?=$accessRef?>"
+            class="dbis-icon dbis-list-accessinfo-<?=$accessRef?>"
           >
             <img src="<?=$this->imageLink('dbis-list-' . $accessRef . '.png')?>" alt="">
           </span>
diff --git a/themes/fid_bbi/templates/footer.phtml b/themes/fid_bbi/templates/footer.phtml
index 77750a76e4e..9ac82ef92bb 100644
--- a/themes/fid_bbi/templates/footer.phtml
+++ b/themes/fid_bbi/templates/footer.phtml
@@ -1,12 +1,12 @@
 <!-- fid_bbi: footer -->
 <footer class="footer">
-  <div class="footer_wrap">
+  <div class="footer-wrap">
     <div class="box -left">
       <div class="grid -break-large">
-        <div class="grid_6">
+        <div class="grid-6">
           <div class="grid -break-small">
-            <div class="grid_3" style="order: 9">
-              <ul class="footer_links">
+            <div class="grid-3" style="order: 9">
+              <ul class="footer-links">
                 <li>
                   <a href="<?=$this->url('content-page', ['page' => 'impressum'])?>">
                     <?=$this->translate('Legal Notes')?>
@@ -35,8 +35,8 @@
               </ul>
             </div>
 
-            <div class="grid_3">
-              <div class="footer_contact">
+            <div class="grid-3">
+              <div class="footer-contact">
                 <address>
                   <?php // TODO: Translate other contact strings? ?>
                   <p>Fachinformationsdienst <br>Buch-, Bibliotheks- und Informationswissenschaft</p>
@@ -55,8 +55,8 @@
           </div>
         </div>
 
-        <div class="grid_6" style="order: -1">
-          <div class="footer_partners">
+        <div class="grid-6" style="order: -1">
+          <div class="footer-partners">
             <a href="https://www.ub.uni-leipzig.de/">
               <img src="<?=$this->imageLink('ubl-logo.svg')?>" alt="Universitätsbibliothek Leipzig">
             </a>
diff --git a/themes/fid_bbi/templates/get-it-box/links.phtml b/themes/fid_bbi/templates/get-it-box/links.phtml
index 230ae50b0f3..edf688cdffe 100644
--- a/themes/fid_bbi/templates/get-it-box/links.phtml
+++ b/themes/fid_bbi/templates/get-it-box/links.phtml
@@ -6,7 +6,7 @@
         <?php foreach ($urls as $url): ?>
           <li>
             <?php $linkText = $this->icon('external-link') . $this->escapeHtml($url['desc']); ?>
-            <?=$this->externalLink($this->escapeHtmlAttr($url['url']), $linkText, ['class' => 'link-with-icon'])?>
+            <?=$this->externalLink($this->escapeHtmlAttr($url['url']), $linkText, ['class' => '-icon'])?>
           </li>
         <?php endforeach; ?>
       </ul>
diff --git a/themes/fid_bbi/templates/header.phtml b/themes/fid_bbi/templates/header.phtml
index 689d9e12b74..7c7b4d6952a 100644
--- a/themes/fid_bbi/templates/header.phtml
+++ b/themes/fid_bbi/templates/header.phtml
@@ -1,6 +1,6 @@
 <!-- fid_bbi: header -->
 <header class="header">
-  <div class="header_main">
+  <div class="header-main">
     <?php
     // NOTE: These strings are hardcoded because they mirror the logo,
     // which is language-independent
@@ -8,10 +8,10 @@
     <?php $isHome = $this->templateDir === 'search' && $this->templateName === 'home'; ?>
     <?php if ($isHome): ?>
       <h1>
-        <a class="header_logo" href="<?=$this->url('home')?>">
+        <a class="header-logo" href="<?=$this->url('home')?>">
           <?=$this->icon('../images/fid-bbi-logo', '')?>
           <span class="sr-only">FID BBI -</span>
-          <span class="header_logo-overlay">
+          <span class="header-logo-overlay">
             Fachinformationsdienst <br>
             Buch-, Bibliotheks- und <br>
             <span style="margin-left: 1px">Informationswissenschaft</span>
@@ -19,13 +19,13 @@
         </a>
       </h1>
     <?php else: ?>
-      <a class="header_logo" href="<?=$this->url('home')?>">
+      <a class="header-logo" href="<?=$this->url('home')?>">
         <?=$this->icon('../images/fid-bbi-logo', '')?>
         <span class="sr-only">FID BBI</span>
       </a>
     <?php endif; ?>
 
-    <div class="header_nav">
+    <div class="header-nav">
       <?=$this->render('nav.phtml')?>
 
       <div class="box -header">
@@ -33,22 +33,22 @@
           <?php if ($isHome): ?>
             <?=$this->layout()->searchbox?>
 
-            <div class="search_links">
+            <div class="search-links">
               <ul>
                 <li>
-                  <a class="link-with-icon" href="<?=$this->url('resources')?>">
+                  <a class="-icon" href="<?=$this->url('resources')?>">
                     <?=$this->icon('arrow-right')?>
                     <?=$this->translate('Data Sources')?>
                   </a>
                 </li>
                 <li>
-                  <a class="link-with-icon" href="<?=$this->url('myresearch/databases')?>">
+                  <a class="-icon" href="<?=$this->url('myresearch/databases')?>">
                     <?=$this->icon('arrow-right')?>
                     <?=$this->translate('Databases')?>
                   </a>
                 </li>
                 <li>
-                  <a class="link-with-icon" href="<?=$this->url('search-advanced')?>">
+                  <a class="-icon" href="<?=$this->url('search-advanced')?>">
                     <?=$this->icon('arrow-right')?>
                     <?=$this->translate('Advanced Search')?>
                   </a>
@@ -56,9 +56,9 @@
               </ul>
             </div>
           <?php else: ?>
-            <div class="search_header">
+            <div class="search-header">
               <h2><?=$this->translate('Search')?></h2>
-              <!-- TODO: Add JS for button -->
+              <?php // TODO: Add JS for button ?>
               <button
                 class="-icon-only -small"
                 type="button"
@@ -72,7 +72,7 @@
 
             <?=$this->layout()->searchbox?>
 
-            <div class="search_menu">
+            <div class="search-menu">
               <a href="<?=$this->url('search-advanced')?>">
                 <?=$this->translate('Advanced Search')?>
               </a>
diff --git a/themes/fid_bbi/templates/html-head.phtml b/themes/fid_bbi/templates/html-head.phtml
index d1654f30fea..6075db607b5 100644
--- a/themes/fid_bbi/templates/html-head.phtml
+++ b/themes/fid_bbi/templates/html-head.phtml
@@ -6,9 +6,8 @@
 <head>
   <?php $this->headThemeResources(); ?>
 
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
-  <meta name="viewport" content="width=device-width,initial-scale=1.0"/>
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width,initial-scale=1.0">
 
   <?=$this->headMeta()?>
   <?=$this->headTitle()?>
diff --git a/themes/fid_bbi/templates/layout/layout.phtml b/themes/fid_bbi/templates/layout/layout.phtml
index ac3f0390dd1..118c33a1897 100644
--- a/themes/fid_bbi/templates/layout/layout.phtml
+++ b/themes/fid_bbi/templates/layout/layout.phtml
@@ -19,24 +19,24 @@
     }
   ?>
   <?php // Add landmark role to avoid 'all content must be inside landmarks error', CK ?>
-  <div role="navigation" aria-label="Skip_navigation_links">
+  <div role="navigation" aria-label="<?=$this->translate('Skip_navigation_links')?>">
     <?php if (isset($this->layout()->srmessage)): ?>
       <span class="sr-only"><?=$this->layout()->srmessage?></span>
     <?php endif; ?>
 
-    <a class="sr-only" href="#searchForm"><?=$this->transEsc('Skip to search')?></a>
-    <a class="sr-only" href="#content"><?=$this->transEsc('Skip to content')?></a>
+    <a class="sr-only" href="#searchForm"><?=$this->translate('Skip to search')?></a>
+    <a class="sr-only" href="#content"><?=$this->translate('Skip to content')?></a>
   </div>
 
   <?=$this->render('header.phtml')?>
 
   <?php // NOTE: `role="main` is obsolete, but several scripts stop working when it is removed ?>
-  <main class="main" role="main">
+  <main class="main" role="main" id="content">
     <?php
     // NOTE: Class `container` is required by JS, otherwise nothing happens
     // when "Save" is clicked in the modal while creating a new list.
     ?>
-    <div class="main_wrap container">
+    <div class="main-wrap container">
       <?=$this->layout()->content?>
     </div>
   </main>
@@ -57,13 +57,13 @@
     aria-labelledby="modal-title"
     aria-modal="true"
   >
-    <section class="modal_content">
+    <section class="modal-content">
       <button class="-icon-only -small close" data-dismiss="modal" tabindex="0">
         <?=$this->icon('x')?>
-        <span class="sr-only"><?=$this->transEsc('Close')?></span>
+        <span class="sr-only"><?=$this->translate('Close')?></span>
       </button>
-      <div class="sr-only" id="modal-description"><?=$this->transEsc('Modal_description')?></div>
-      <div class="modal_main modal-body"><?=$this->transEsc('Loading')?>&nbsp;&hellip;</div>
+      <div class="sr-only" id="modal-description"><?=$this->translate('Modal_description')?></div>
+      <div class="modal-main modal-body"><?=$this->translate('Loading')?>&nbsp;&hellip;</div>
     </section>
   </div>
 
diff --git a/themes/fid_bbi/templates/myresearch/bulk-action-buttons.phtml b/themes/fid_bbi/templates/myresearch/bulk-action-buttons.phtml
index 862a4a61b0d..d14658fdd14 100644
--- a/themes/fid_bbi/templates/myresearch/bulk-action-buttons.phtml
+++ b/themes/fid_bbi/templates/myresearch/bulk-action-buttons.phtml
@@ -14,22 +14,22 @@
   <input type="hidden" name="listName" value="<?=$this->escapeHtmlAttr($locations->title)?>">
 <?php endif; ?>
 
-<div class="results_bulk-actions">
-  <div class="results_bulk-selection">
+<div class="results-bulk-actions">
+  <div class="results-bulk-selection">
     <input type="checkbox" name="selectAll" class="checkbox-select-all" id="myresearchCheckAll">
     <label for="myresearchCheckAll">
       <?=$this->translate('select_page')?> | <?=$this->translate('with_selected')?>:
     </label>
   </div>
-  <div class="results_bulk-buttons">
+  <div class="results-bulk-buttons">
     <?php if ($this->cart()->isActive()): ?>
-      <button class="button -icon -small" id="<?=$this->idPrefix?>updateCart" type="submit" name="add">
+      <button class="-icon -small" id="<?=$this->idPrefix?>updateCart" type="submit" name="add">
         <?=$this->icon('pin')?>
         <?=$this->translate('Add to Book Bag')?>
       </button>
     <?php endif; ?>
 
-    <button class="button -icon -small" type="submit" name="email" title="<?=$this->translate('email_selected')?>">
+    <button class="-icon -small" type="submit" name="email" title="<?=$this->translate('email_selected')?>">
       <?=$this->icon('mail')?>
       <?=$this->translate('Email')?>
     </button>
@@ -37,7 +37,7 @@
     <?php $user = $this->auth()->isLoggedIn(); ?>
     <?php if ((null !== $this->list && $this->list->editAllowed($user)) || null === $this->list && $user): ?>
       <button
-        class="button -icon -small"
+        class="-icon -small"
         id="<?=$this->idPrefix?>delete_list_items_<?=$this->list !== null ? $this->escapeHtmlAttr($this->list->id) : ''?>"
         type="submit" name="delete"
         title="<?=$this->translate('delete_selected')?>"
@@ -48,14 +48,14 @@
     <?php endif; ?>
 
     <?php $exportOptions = $this->export()->getActiveFormats('bulk'); if (count($exportOptions) > 0): ?>
-      <button class="button -icon -small" type="submit" name="export" title="<?=$this->translate('export_selected')?>">
+      <button class="-icon -small" type="submit" name="export" title="<?=$this->translate('export_selected')?>">
       <?=$this->icon('download')?>
         <?=$this->translate('Export')?>
       </button>
     <?php endif; ?>
 
     <button
-      class="button -icon -small"
+      class="-icon -small"
       type="submit"
       name="print"
       title="<?=$this->translate('print_selected')?>"
diff --git a/themes/fid_bbi/templates/myresearch/dbis-content.phtml b/themes/fid_bbi/templates/myresearch/dbis-content.phtml
index c4f61841097..e78c804c579 100644
--- a/themes/fid_bbi/templates/myresearch/dbis-content.phtml
+++ b/themes/fid_bbi/templates/myresearch/dbis-content.phtml
@@ -14,7 +14,7 @@
 
 <p><?=$this->translate('dbis_text')?></p>
 
-<div class="dbis_content" id="dbis_content" style="min-height: 140px; position: relative">
+<div class="dbis-content" id="dbis_content" style="min-height: 140px; position: relative">
   <div class="modal-loading">
     <span class="sr-only"><?=$this->translate('Loading')?></span>
   </div>
diff --git a/themes/fid_bbi/templates/myresearch/editlist.phtml b/themes/fid_bbi/templates/myresearch/editlist.phtml
index b6f379700c8..243dbaefdce 100644
--- a/themes/fid_bbi/templates/myresearch/editlist.phtml
+++ b/themes/fid_bbi/templates/myresearch/editlist.phtml
@@ -54,11 +54,11 @@ $this->headTitle($this->translate($pageTitle));
   <?php elseif ($this->userlist()->getMode() === 'private_only'): ?>
     <input type="hidden" name="public" value="0">
   <?php else: ?>
-    <div class="form_row">
-      <div class="form_label" id="access-label">
+    <div class="form-group">
+      <div class="form-label" id="access-label">
         <?=$this->translate('Access')?>
       </div>
-      <div class="form_control" aria-labelledby="access-label">
+      <div class="form-inputs" aria-labelledby="access-label">
         <p>
           <input
             id="list_public_1"
diff --git a/themes/fid_bbi/templates/myresearch/menu.phtml b/themes/fid_bbi/templates/myresearch/menu.phtml
index 8557531b3c8..e6d37b80e23 100644
--- a/themes/fid_bbi/templates/myresearch/menu.phtml
+++ b/themes/fid_bbi/templates/myresearch/menu.phtml
@@ -2,7 +2,7 @@
 <?php $user = $this->auth()->isLoggedIn(); ?>
 <?php if (!empty($user)): ?>
   <div class="sidebar -profile" id="profile-menu">
-    <div class="sidebar_header">
+    <div class="sidebar-header">
       <h2><?=$this->translate('Profile Menu')?></h2>
       <button
         class="-icon-only -small"
@@ -14,7 +14,7 @@
       </button>
     </div>
 
-    <div class="sidebar_inner">
+    <div class="sidebar-inner">
       <h3><?=$this->translate('Your Account')?></h3>
       <ul class="unstyled-list">
         <?php if ('ils-none' !== $this->ils()->getOfflineMode()): ?>
diff --git a/themes/fid_bbi/templates/myresearch/mylist.phtml b/themes/fid_bbi/templates/myresearch/mylist.phtml
index ae75d713c5b..95aabfc7333 100644
--- a/themes/fid_bbi/templates/myresearch/mylist.phtml
+++ b/themes/fid_bbi/templates/myresearch/mylist.phtml
@@ -36,22 +36,22 @@ $user = $this->auth()->isLoggedIn();
 <?=$this->flashmessages()?>
 
 <div class="results">
-  <button class="results_sidebar-toggle" type="button" aria-controls="profile-menu">
+  <button class="results-sidebar-toggle" type="button" aria-controls="profile-menu">
     <?=$this->icon('person')?>
     <span><?=$this->transEsc('Profile Menu')?></span>
   </button>
 
-  <div class="results_list -wide">
-    <nav class="results_header -wide">
+  <div class="results-list -wide">
+    <nav class="results-header -wide">
       <?php if ($recordTotal > 0): ?>
-        <div class="results_count">
+        <div class="results-count">
           <?=$this->translate('%%count%% results', ['%%count%%' => $this->localizedNumber($recordTotal)])?>
         </div>
       <?php endif; ?>
 
       <?php if (isset($list)): ?>
         <?php if ($list->editAllowed($account->isLoggedIn())): ?>
-          <div class="results_list-actions">
+          <div class="results-list-actions">
             <div>
               <a href="<?=$this->url('editList', ['id' => $list->id])?>">
                 <?=$this->transEsc('edit_list')?>
@@ -88,7 +88,7 @@ $user = $this->auth()->isLoggedIn();
     </nav>
 
     <?php if ($list && !empty($list->description)): ?>
-      <p class="results_list-description"><?=$this->escapeHtml($list->description)?></p>
+      <p class="results-list-description"><?=$this->escapeHtml($list->description)?></p>
     <?php endif; ?>
 
     <?php if ($recordTotal > 0): ?>
@@ -102,9 +102,9 @@ $user = $this->auth()->isLoggedIn();
       >
         <?=$this->context($this)->renderInContext('myresearch/bulk-action-buttons.phtml', ['idPrefix' => '', 'list' => $list ?? null, 'account' => $this->account])?>
         <ul class="record-list">
-        <?php foreach ($this->results->getResults() as $i => $current): ?>
-          <?=$this->record($current)->getListEntry($list, $user)?>
-        <?php endforeach; ?>
+          <?php foreach ($this->results->getResults() as $i => $current): ?>
+            <?=$this->record($current)->getListEntry($list, $user)?>
+          <?php endforeach; ?>
         </ul>
       </form>
 
diff --git a/themes/fid_bbi/templates/myresearch/profile.phtml b/themes/fid_bbi/templates/myresearch/profile.phtml
index 3f02dd1e289..45462d37c34 100644
--- a/themes/fid_bbi/templates/myresearch/profile.phtml
+++ b/themes/fid_bbi/templates/myresearch/profile.phtml
@@ -27,12 +27,12 @@ if (is_array($profile)) {
 <?=$this->flashmessages();?>
 
 <div class="results">
-  <button class="results_sidebar-toggle" type="button" aria-controls="profile-menu">
+  <button class="results-sidebar-toggle" type="button" aria-controls="profile-menu">
     <?=$this->icon('person')?>
     <span><?=$this->transEsc('Profile Menu')?></span>
   </button>
 
-  <div class="results_list">
+  <div class="results-list">
     <?php if (is_array($this->profile)): ?>
       <dl>
         <?=$this->renderArray(
@@ -51,7 +51,9 @@ if (is_array($profile)) {
           )
         )?>
       </dl>
-      <a href="<?=$this->url('fid/user/update')?>" class="btn btn-primary"><?=$this->transEsc('fid::Edit Account')?></a>
+      <p>
+        <a href="<?=$this->url('fid/user/update')?>" class="btn btn-primary"><?=$this->transEsc('fid::Edit Account')?></a>
+      </p>
     <?php $patronTemplateSet = $this->patronLoginView && !empty($this->patronLoginView->getTemplate()); ?>
     <?php elseif ($this->ils()->getOfflineMode() !== 'ils-none' && $patronTemplateSet): ?>
       <?=$this->partial($this->patronLoginView);?>
diff --git a/themes/fid_bbi/templates/myresearch/usertags.phtml b/themes/fid_bbi/templates/myresearch/usertags.phtml
index a1511444706..5a99dc56aa2 100644
--- a/themes/fid_bbi/templates/myresearch/usertags.phtml
+++ b/themes/fid_bbi/templates/myresearch/usertags.phtml
@@ -4,12 +4,12 @@
 <h1><?=$this->translate('Your Tags')?></h1>
 
 <div class="results">
-  <button class="results_sidebar-toggle" type="button" aria-controls="profile-menu">
+  <button class="results-sidebar-toggle" type="button" aria-controls="profile-menu">
     <?=$this->icon('person')?>
     <span><?=$this->transEsc('Profile Menu')?></span>
   </button>
 
-  <div class="results_list">
+  <div class="results-list">
     <?php if (!empty($tags)): ?>
       <table class="tags table-responsive">
         <tr>
diff --git a/themes/fid_bbi/templates/nav.phtml b/themes/fid_bbi/templates/nav.phtml
index 07bf23eb3dc..5ebebd52e8d 100644
--- a/themes/fid_bbi/templates/nav.phtml
+++ b/themes/fid_bbi/templates/nav.phtml
@@ -1,7 +1,7 @@
 <!-- fid_bbi: nav -->
 <nav class="nav">
   <button
-    class="nav_toggle -search"
+    class="nav-toggle -search"
     type="button"
     aria-controls="search"
     aria-label="<?=$this->transEsc('Open search')?>"
@@ -10,7 +10,7 @@
     <?=$this->transEsc('Search')?>
   </button>
   <button
-    class="nav_toggle -menu"
+    class="nav-toggle -menu"
     type="button"
     aria-controls="menu"
     aria-label="<?=$this->transEsc('Open navigation')?>"
@@ -19,9 +19,9 @@
     <?=$this->transEsc('Info')?>
   </button>
 
-  <div class="nav_main" id="menu">
-    <div class="nav_header">
-      <h2><?=$this->transEsc('Info Pages')?></h2>
+  <div class="nav-main" id="menu">
+    <div class="nav-header">
+      <h2><?=$this->translate('Info Pages')?></h2>
       <button
         class="-icon-only -small"
         type="button"
@@ -34,7 +34,7 @@
     </div>
     <ul>
       <?php $fallbackUrl = $this->config()->get('config')->RssConsumer['fallback_url'] ?? ''; ?>
-      <li class="nav_home">
+      <li class="nav-home">
         <a href="<?=$this->url('home')?>">
           <?=$this->icon('home')?>
           <span class="sr-only"><?=$this->transEsc('Home')?></span>
@@ -63,7 +63,7 @@
     </ul>
   </div>
 
-  <div class="nav_aside">
+  <div class="nav-aside">
     <ul>
       <?php $account = $this->auth()->getManager(); ?>
       <?php if (is_object($account) && $account->loginEnabled()): ?>
@@ -116,7 +116,7 @@
         <?php foreach ($this->layout()->allLangs as $langCode => $langName): ?>
           <li>
             <a
-              class="nav_lang <?=$this->layout()->userLang == $langCode ? '-current' : ''?>"
+              class="nav-lang <?=$this->layout()->userLang == $langCode ? '-current' : ''?>"
               href="javascript:document.langForm.mylang.value='<?=$langCode?>';document.langForm.submit()"
               title="<?=$this->displayLanguageOption($langName)?>"
             >
diff --git a/themes/fid_bbi/templates/record/cart-buttons.phtml b/themes/fid_bbi/templates/record/cart-buttons.phtml
index c5a303a1868..bbcdd8a09b9 100644
--- a/themes/fid_bbi/templates/record/cart-buttons.phtml
+++ b/themes/fid_bbi/templates/record/cart-buttons.phtml
@@ -9,15 +9,15 @@
   >
     <a class="cart-add hidden<?php if (!$cart->contains($cartId)): ?> correct<?php endif ?>" href="javascript:;">
       <?=$this->icon('pin')?>
-      <div class="tooltip">
+      <span class="tooltip">
         <?=$this->transEsc('Add to Book Bag')?>
-      </div>
+      </span>
     </a>
     <a class="cart-remove hidden<?php if ($cart->contains($cartId)): ?> correct<?php endif ?>" href="javascript:;">
       <?=$this->icon('pin', 'icon -beat')?>
-      <div class="tooltip">
+      <span class="tooltip">
         <?=$this->transEsc('Remove from Book Bag')?>
-      </div>
+      </span>
     </a>
   </span>
 <?php endif; ?>
diff --git a/themes/fid_bbi/templates/record/taglist.phtml b/themes/fid_bbi/templates/record/taglist.phtml
index 9a3289a2c66..66bafcc6edc 100644
--- a/themes/fid_bbi/templates/record/taglist.phtml
+++ b/themes/fid_bbi/templates/record/taglist.phtml
@@ -3,7 +3,7 @@
 <div class="tags tagList <?=$loggedin ? 'loggedin' : ''?>">
   <?php if (count($tagList) > 0): ?>
     <?php foreach ($tagList as $tag): ?>
-      <div class="tags_item">
+      <div class="tags-item">
         <a href="<?=$this->url('tag-home')?>?lookfor=<?=urlencode($tag['tag'])?>">
           <?=$this->escapeHtml($tag['tag'])?>
         </a>
@@ -17,12 +17,12 @@
           <form
             method="POST"
             action="<?=$this->recordLink()->getActionUrl($this->driver, $taggedByCurrentUser ? 'DeleteTag' : 'AddTag')?>"
-            class="tags_form"
+            class="tags-form"
           >
             <input type="hidden" name="tag" value="<?=$this->escapeHtmlAttr($tag['tag'])?>">
             <?php $buttonLabel = $this->transEsc($taggedByCurrentUser ? 'delete_tag' : 'confirm_tag'); ?>
             <button
-              class="tags_button"
+              class="tags-button"
               type="submit"
               onClick="ajaxTagUpdate(this, '<?=$this->escapeHtmlAttr($tag['tag'])?>', <?=$taggedByCurrentUser ? 'true' : 'false'?>); return false;"
               aria-label="<?=$buttonLabel?>"
diff --git a/themes/fid_bbi/templates/record/view.phtml b/themes/fid_bbi/templates/record/view.phtml
index 77c149dabc5..63672649a12 100644
--- a/themes/fid_bbi/templates/record/view.phtml
+++ b/themes/fid_bbi/templates/record/view.phtml
@@ -32,12 +32,12 @@ if ($this->export()->recordSupportsFormat($this->driver, 'RDF')) {
   <?php if (count($this->tabs) > 0): ?>
     <div class="record-tabs">
       <?php // NOTE: Class "nav-tabs" is required by Bootstrap JS ?>
-      <ul class="tabs_header nav-tabs">
+      <ul class="tabs-header nav-tabs">
         <?php foreach ($this->tabs as $tab => $obj): ?>
           <?php
           $desc = $obj->getDescription();
           $tabName = preg_replace("/\W/", "-", strtolower($tab));
-          $tabClasses = [ 'record-tab', $tabName ];
+          $tabClasses = [ 'record-tab', 'tabs-button', $tabName ];
           if (strcasecmp($this->activeTab, $tab) === 0) {
             if (!$this->loadInitialTabWithAjax || !$obj->supportsAjax()) {
               $tabClasses[] = 'active';
diff --git a/themes/fid_bbi/templates/search/advanced-search-info.phtml b/themes/fid_bbi/templates/search/advanced-search-info.phtml
index 99a693622f7..17e1d9bcbd7 100644
--- a/themes/fid_bbi/templates/search/advanced-search-info.phtml
+++ b/themes/fid_bbi/templates/search/advanced-search-info.phtml
@@ -18,7 +18,7 @@ $options = $this->searchOptions($this->searchClassId);
 $advSearch = $options->getAdvancedSearchAction();
 ?>
 
-  <div class="results_advanced-search-info">
+  <div class="results-advanced-search-info">
     <?=$this->icon('magnifier')?>
 
     <h3><?=$this->translate('Advanced Search')?></h3>
diff --git a/themes/fid_bbi/templates/search/controls/sort.phtml b/themes/fid_bbi/templates/search/controls/sort.phtml
index 4ac1be9b25e..12d1a0ffb27 100644
--- a/themes/fid_bbi/templates/search/controls/sort.phtml
+++ b/themes/fid_bbi/templates/search/controls/sort.phtml
@@ -2,7 +2,7 @@
 <?php $list = $this->params->getSortList(); ?>
 <?php if (!empty($list)): ?>
   <?php // NOTE: JS requires the classes "search-sort" and "jumpMenu", and <select> to be a child of <form> ?>
-  <form action="<?=$this->currentPath()?>" class="results_sort search-sort" method="get" name="sort">
+  <form action="<?=$this->currentPath()?>" class="results-sort search-sort" method="get" name="sort">
     <?=$this->results->getUrlQuery()->asHiddenFields(['sort' => '/.*/']);?>
     <label for="sort_options_1">
       <?=$this->transEsc('Sorted by')?>
diff --git a/themes/fid_bbi/templates/search/history.phtml b/themes/fid_bbi/templates/search/history.phtml
index 70a3a8b5449..6e56f12b3eb 100644
--- a/themes/fid_bbi/templates/search/history.phtml
+++ b/themes/fid_bbi/templates/search/history.phtml
@@ -24,12 +24,12 @@ $saveSupported = $this->accountCapabilities()->getSavedSearchSetting() === 'enab
 <?=$this->flashmessages()?>
 
 <div class="results">
-  <button class="results_sidebar-toggle" type="button" aria-controls="profile-menu">
+  <button class="results-sidebar-toggle" type="button" aria-controls="profile-menu">
     <?=$this->icon('person')?>
     <span><?=$this->transEsc('Profile Menu')?></span>
   </button>
 
-  <div class="results_list -wide">
+  <div class="results-list -wide">
     <?php if ($saveSupported && !empty($this->saved)): ?>
       <h2><?=$this->translate('history_saved_searches')?></h2>
       <?=$this->context()->renderInContext('search/history-table.phtml', ['showSaved' => true]);?>
diff --git a/themes/fid_bbi/templates/search/home.phtml b/themes/fid_bbi/templates/search/home.phtml
index 267e73085c0..46549161e21 100644
--- a/themes/fid_bbi/templates/search/home.phtml
+++ b/themes/fid_bbi/templates/search/home.phtml
@@ -7,7 +7,7 @@ $this->layout()->breadcrumbs = false;
 <p class="tagline"><?=$this->translate('home_tagline')?></p>
 
 <div class="grid -break-large -margin-bottom">
-  <div class="grid_8">
+  <div class="grid-8">
     <h2 class="sr-only"><?=$this->translate('Recent Blog Posts')?></h2>
 
     <?php $posts = $this->rss(); ?>
@@ -15,50 +15,50 @@ $this->layout()->breadcrumbs = false;
       <div class="posts">
         <?php foreach ($posts as $post): ?>
           <article class="post">
-            <header class="post_header">
-              <a class="post_link" href="<?=$post->link?>">
-                <h3 class="post_title"><?=$post->title?></h3>
-                <time class="post_date"><?=$post->date?></time>
+            <header class="post-header">
+              <a class="post-link" href="<?=$post->link?>">
+                <h3 class="post-title"><?=$post->title?></h3>
+                <div class="post-date"><?=$post->date?></div>
               </a>
             </header>
-            <p class="post_excerpt"><?=$post->excerpt?></p>
+            <p class="post-excerpt"><?=$post->excerpt?></p>
           </article>
         <?php endforeach; ?>
       </div>
     <?php endif; ?>
   </div>
 
-  <div class="grid_4">
+  <div class="grid-4">
     <div class="item-list">
-      <div class="item-list_item">
-        <div class="item-list_prefix">
+      <div class="item-list-item">
+        <div class="item-list-prefix">
           <span aria-hidden="true">i</span>
         </div>
-        <div class="item-list_content">
+        <div class="item-list-content">
           <?=$this->translate('home_step_1')?>
         </div>
       </div>
-      <div class="item-list_item">
-        <div class="item-list_prefix">
+      <div class="item-list-item">
+        <div class="item-list-prefix">
           <?=$this->icon('magnifier')?>
         </div>
-        <div class="item-list_content">
+        <div class="item-list-content">
           <?=$this->translate('home_step_2')?>
         </div>
       </div>
-      <div class="item-list_item">
-        <div class="item-list_prefix">
+      <div class="item-list-item">
+        <div class="item-list-prefix">
           <?=$this->icon('sources')?>
         </div>
-        <div class="item-list_content">
+        <div class="item-list-content">
           <?=$this->translate('home_step_3')?>
         </div>
       </div>
-      <div class="item-list_item">
-        <div class="item-list_prefix">
+      <div class="item-list-item">
+        <div class="item-list-prefix">
           <?=$this->icon('signup')?>
         </div>
-        <div class="item-list_content">
+        <div class="item-list-content">
           <?=$this->translate('home_step_4')?>
         </div>
       </div>
@@ -68,19 +68,19 @@ $this->layout()->breadcrumbs = false;
 
 <div class="box -left">
   <div class="grid -break-medium">
-    <div class="grid_6">
+    <div class="grid-6">
       <?=$this->translate('home_sources')?>
       <p>
-        <a class="link-with-icon" href="<?=$this->url('resources')?>">
+        <a class="-icon" href="<?=$this->url('resources')?>">
           <?=$this->icon('arrow-right')?>
           <?=$this->translate('Browse data sources')?>
         </a>
       </p>
     </div>
-    <div class="grid_6">
+    <div class="grid-6">
       <?=$this->translate('home_databases')?>
       <p>
-        <a class="link-with-icon" href="<?=$this->url('myresearch/databases')?>">
+        <a class="-icon" href="<?=$this->url('myresearch/databases')?>">
           <?=$this->icon('arrow-right')?>
           <?=$this->translate('Show databases')?>
         </a>
@@ -90,13 +90,13 @@ $this->layout()->breadcrumbs = false;
 </div>
 
 <div class="grid -break-medium">
-  <div class="grid_6">
+  <div class="grid-6">
     <?=$this->translate('home_suggestions', [
       '%%feedback_url%%' => $this->url('feedback-home'),
       '%%blog_url%%' => $this->translate('bbi_blog_url')
     ])?>
   </div>
-  <div class="grid_6">
+  <div class="grid-6">
     <?=$this->translate('home_provision', [
       '%%feedback_url%%' => $this->url('feedback-home'),
     ])?>
diff --git a/themes/fid_bbi/templates/search/pagination.phtml b/themes/fid_bbi/templates/search/pagination.phtml
index 42774b63d67..88f4a12973b 100644
--- a/themes/fid_bbi/templates/search/pagination.phtml
+++ b/themes/fid_bbi/templates/search/pagination.phtml
@@ -1,34 +1,34 @@
 <!-- fid_bbi: search - pagination -->
 <?php if ($this->pageCount): ?>
   <div class="pagination">
-    <div class="pagination_control">
+    <div class="pagination-control">
       <?php if (isset($this->previous)): ?>
         <a
-          class="pagination_link -previous"
+          class="pagination-link -previous"
           href="<?=$this->currentPath() . $this->results->getUrlQuery()->setPage($this->previous)?>"
         >
           <?=$this->icon('arrow-left')?>
-          <span class="pagination_link-label">
+          <span class="pagination-link-label">
             <?=$this->translate('Previous')?>
           </span>
         </a>
       <?php endif; ?>
     </div>
 
-    <div class="pagination_page">
+    <div class="pagination-page">
       <?=$this->translate('Page %%current%% of %%total%%', [
         '%%current%%' => $this->current,
         '%%total%%' => $this->pageCount,
       ])?>
     </div>
 
-    <div class="pagination_control">
+    <div class="pagination-control">
       <?php if (isset($this->next)): ?>
         <a
-          class="pagination_link -next"
+          class="pagination-link -next"
           href="<?=$this->currentPath() . $this->results->getUrlQuery()->setPage($this->next)?>"
         >
-          <span class="pagination_link-label">
+          <span class="pagination-link-label">
             <?=$this->translate('Next')?>
           </span>
           <?=$this->icon('arrow-right')?>
diff --git a/themes/fid_bbi/templates/search/results.phtml b/themes/fid_bbi/templates/search/results.phtml
index 2caae46a4ba..70b8d0fc5f3 100644
--- a/themes/fid_bbi/templates/search/results.phtml
+++ b/themes/fid_bbi/templates/search/results.phtml
@@ -63,7 +63,7 @@ $this->headScript()->appendFile("check_save_statuses.js");
   <h1 class="sr-only"><?=$this->transEsc('Search Results')?></h1>
 
   <button
-    class="results_sidebar-toggle"
+    class="results-sidebar-toggle"
     type="button"
     aria-controls="sidebar"
     aria-label="<?=$this->transEsc('Show functions & filters')?>"
@@ -72,16 +72,16 @@ $this->headScript()->appendFile("check_save_statuses.js");
     <span><?=$this->transEsc('Functions & Filters')?></span>
   </button>
 
-  <div class="results_list">
+  <div class="results-list">
     <h2 class="sr-only"><?=$this->translate('Search Results')?></h2>
 
     <?=$this->flashmessages()?>
 
-    <div class="results_header">
+    <div class="results-header">
       <?php if ($this->params->getSearchType() === 'advanced'):?>
         <?=$this->render('search/advanced-search-info.phtml');?>
       <?php endif; ?>
-      <div class="results_count">
+      <div class="results-count">
         <?=$this->translate('results_count', ['%%count%%' => $this->localizedNumber($recordTotal)])?>
       </div>
 
@@ -133,7 +133,7 @@ $this->headScript()->appendFile("check_save_statuses.js");
   </div>
 
   <div id="sidebar" class="sidebar">
-    <div class="sidebar_header">
+    <div class="sidebar-header">
       <h2><?=$this->transEsc('Functions & Filters')?></h2>
       <button
         class="-icon-only -small"
@@ -146,9 +146,9 @@ $this->headScript()->appendFile("check_save_statuses.js");
       </button>
     </div>
 
-    <div id="sidebar-inner" class="sidebar_inner">
+    <div id="sidebar-inner" class="sidebar-inner">
       <?php if ($recordTotal > 0): ?>
-        <div class="results_actions">
+        <div class="results-actions">
           <?php // TODO: Content linked could still be broken, including lightboxes ?>
           <?php $cart = $this->cart(); ?>
           <?php if ($cart->isActive()): ?>
diff --git a/themes/fid_bbi/templates/search/searchbox.phtml b/themes/fid_bbi/templates/search/searchbox.phtml
index 09f22e1449b..b5c3baa15cd 100644
--- a/themes/fid_bbi/templates/search/searchbox.phtml
+++ b/themes/fid_bbi/templates/search/searchbox.phtml
@@ -1,5 +1,4 @@
 <!-- fid_bbi: search - searchbox -->
-
 <?php
 // Set default value if necessary:
 if (!isset($this->searchClassId)) {
@@ -52,111 +51,109 @@ $tabConfig = $this->searchTabs()->getTabConfig(
 );
 ?>
 
-  <!-- TODO: Use longer placeholder on large screen, like in the mockup?-->
-  <?php $placeholder = $this->translate('search_terms'); ?>
-  <form
-    action="<?=$this->url($basicSearch)?>"
-    autocomplete="off"
-    class="search_form"
-    id="searchForm"
-    name="searchForm"
+<?php // TODO: Use longer placeholder on large screen, like in the mockup? ?>
+<?php $placeholder = $this->translate('search_terms'); ?>
+<form
+  action="<?=$this->url($basicSearch)?>"
+  autocomplete="off"
+  class="search-form"
+  id="searchForm"
+  name="searchForm"
+>
+  <?php
+  // Modfied copy from fid_adlr
+  $filterDetails = $this->searchbox()->getFilterDetails(
+    isset($this->filterList) && is_array($this->filterList) ? $this->filterList : [],
+    isset($this->checkboxFilters) && is_array($this->checkboxFilters) ? $this->checkboxFilters : []
+  );
+  $filterActive = !empty($filterDetails)
+    || (($tabConfig['tabs'][0]['label'] ?? '') !== ($tabConfig['selected']['label'] ?? ''));
+  ?>
+
+  <input
+    aria-label="<?=$this->translate('search_terms')?>"
+    class="search-input <?=$filterActive ? '-pad-right' : ''?>"
+    data-focus-off-canvas
+    name="lookfor"
+    onblur="this.placeholder = '<?=$placeholder?>'"
+    onfocus="this.placeholder = ''"
+    placeholder="<?=$placeholder?>"
+    type="text"
+    value="<?=$this->escapeHtmlAttr($this->lookfor)?>"
   >
-    <?php
-    // Modfied copy from fid_adlr
-    $filterDetails = $this->searchbox()->getFilterDetails(
-      isset($this->filterList) && is_array($this->filterList) ? $this->filterList : [],
-      isset($this->checkboxFilters) && is_array($this->checkboxFilters) ? $this->checkboxFilters : []
-    );
-    $filterActive = !empty($filterDetails)
-      || (($tabConfig['tabs'][0]['label'] ?? '') !== ($tabConfig['selected']['label'] ?? ''));
-    ?>
-
-    <input
-      aria-label="<?=$this->translate('search_terms')?>"
-      class="search_input <?=$filterActive ? '-pad-right' : ''?>"
-      data-focus-off-canvas
-      name="lookfor"
-      onblur="this.placeholder = '<?=$placeholder?>'"
-      onfocus="this.placeholder = ''"
-      placeholder="<?=$placeholder?>"
-      type="text"
-      value="<?=$this->escapeHtmlAttr($this->lookfor)?>"
-    >
 
-    <?php if ($filterActive): ?>
-      <?php $defaultFilterState = $options->getRetainFilterSetting() ? 'checked' : ''; ?>
-      <div id="searchFormKeepFilters" class="search_keep-filters">
-        <?php // NOTE: ID keepfilters and class searchFormKeepFilters required by JS ?>
-        <label>
-          <input id="keepfilters" type="checkbox" <?=$defaultFilterState?> class="searchFormKeepFilters">
-          <?=$this->icon('filter')?>
-          <div class="tooltip">
-            <span>
-              <?=$this->translate('Filters are kept')?>
-            </span>
-            <span>
-              <?=$this->translate('Filters are not kept')?>
-            </span>
-          </div>
+  <?php if ($filterActive): ?>
+    <?php $defaultFilterState = $options->getRetainFilterSetting() ? 'checked' : ''; ?>
+    <div id="searchFormKeepFilters" class="search-keep-filters">
+      <?php // NOTE: ID keepfilters and class searchFormKeepFilters required by JS ?>
+      <label>
+        <input id="keepfilters" type="checkbox" <?=$defaultFilterState?> class="searchFormKeepFilters">
+        <?=$this->icon('filter')?>
+        <span class="tooltip">
+          <span>
+            <?=$this->translate('Filters are kept')?>
+          </span>
+          <span>
+            <?=$this->translate('Filters are not kept')?>
+          </span>
+        </span>
+      </label>
+    </div>
+
+    <div class="hidden">
+      <?php foreach ($filterDetails as $current): ?>
+        <input
+          class="applied-filter"
+          id="<?=$this->escapeHtmlAttr($current['id'])?>"
+          type="checkbox"
+          <?=$defaultFilterState?>
+          name="filter[]"
+          value="<?=$this->escapeHtmlAttr($current['value'])?>"
+        >
+        <label for="<?=$this->escapeHtmlAttr($current['id'])?>">
+          <?=$this->escapeHtml($current['value'])?>
         </label>
-      </div>
-
-      <div class="hidden">
-        <?php foreach ($filterDetails as $current): ?>
-          <input
-            class="applied-filter"
-            id="<?=$this->escapeHtmlAttr($current['id'])?>"
-            type="checkbox"
-            <?=$defaultFilterState?>
-            name="filter[]"
-            value="<?=$this->escapeHtmlAttr($current['value'])?>"
-          >
-          <label for="<?=$this->escapeHtmlAttr($current['id'])?>">
-            <?=$this->escapeHtml($current['value'])?>
-          </label>
-        <?php endforeach; ?>
-
-        <?php if (isset($hasDefaultsApplied) && $hasDefaultsApplied): ?>
-          <?php
-          // This is a hidden element that flags whether or not default filters have been applied;
-          // it is intentionally unlabeled, as users are not meant to manipulate it directly.
-          ?>
-          <input
-            class="applied-filter"
-            id="dfApplied"
-            type="checkbox"
-            name="dfApplied"
-            value="1"
-            <?=$defaultFilterState?>
-          >
-        <?php endif; ?>
-      </div>
-    <?php endif; ?>
-
-    <button class="search_submit" type="submit">
-      <?=$this->icon('magnifier')?>
-      <?=$this->transEsc('Find')?>
-    </button>
-  </form>
-
-  <?php // Modfied copy from fid_adlr ?>
-  <script type="text/javascript">
-    $(document).ready(function() {
-      $('#keepfilters').on('click', function () {
-        // reset type / category filter to default: All
-        if ($('input[id ="keepfilters"]').prop('checked') == false) {
-          var typeOptions = $('input[name ="format-pre-filter"]');
-          for (var opt, j = 0; opt = typeOptions[j]; j++) {
-            if (opt.id.includes("All")) {
-              opt.checked = true;
-            } else {
-              opt.checked = false;
-            }
+      <?php endforeach; ?>
+
+      <?php if (isset($hasDefaultsApplied) && $hasDefaultsApplied): ?>
+        <?php
+        // This is a hidden element that flags whether or not default filters have been applied;
+        // it is intentionally unlabeled, as users are not meant to manipulate it directly.
+        ?>
+        <input
+          class="applied-filter"
+          id="dfApplied"
+          type="checkbox"
+          name="dfApplied"
+          value="1"
+          <?=$defaultFilterState?>
+        >
+      <?php endif; ?>
+    </div>
+  <?php endif; ?>
+
+  <button class="search-submit" type="submit">
+    <?=$this->icon('magnifier')?>
+    <?=$this->transEsc('Find')?>
+  </button>
+</form>
+
+<?php // Modfied copy from fid_adlr ?>
+<script type="text/javascript">
+  $(document).ready(function() {
+    $('#keepfilters').on('click', function () {
+      // reset type / category filter to default: All
+      if ($('input[id ="keepfilters"]').prop('checked') == false) {
+        var typeOptions = $('input[name ="format-pre-filter"]');
+        for (var opt, j = 0; opt = typeOptions[j]; j++) {
+          if (opt.id.includes("All")) {
+            opt.checked = true;
+          } else {
+            opt.checked = false;
           }
         }
-      });
+      }
     });
-  </script>
-
-
+  });
+</script>
 <!-- fid_bbi: search - searchbox - END -->
-- 
GitLab