From 5ba45909d4ed1776c96788bcdc27e492dac03d11 Mon Sep 17 00:00:00 2001
From: Brian Canini <canini.16@osu.edu>
Date: Thu, 26 Aug 2021 11:11:27 -0400
Subject: [PATCH] - Upgrading drupal/admin_toolbar (2.4.0 => 3.0.2)

---
 composer.json                                 |   2 +-
 composer.lock                                 |  19 ++-
 vendor/composer/InstalledVersions.php         |  10 +-
 vendor/composer/installed.json                |  19 ++-
 vendor/composer/installed.php                 |  10 +-
 web/modules/admin_toolbar/README.txt          |   2 +-
 .../admin_toolbar/admin_toolbar.info.yml      |  10 +-
 .../admin_toolbar/admin_toolbar.libraries.yml |  13 +-
 .../admin_toolbar/admin_toolbar.module        |   9 +
 ...admin_toolbar_links_access_filter.info.yml |   6 +-
 .../admin_toolbar_links_access_filter.module  |  33 +++-
 .../admin_toolbar_search.info.yml             |  10 +-
 .../admin_toolbar_search.services.yml         |   1 +
 .../css/admin.toolbar_search.css              |   3 +-
 .../css/admin.toolbar_search.css.orig         |  20 ---
 .../js/admin_toolbar_search.js                |   4 +-
 .../js/admin_toolbar_search.js.orig           | 134 ---------------
 .../admin_toolbar_search/src/SearchLinks.php  | 154 +++++++++++-------
 .../AdminToolbarSearchTestBase.php            |   6 +-
 .../AdminToolbarToolsSearchTest.php           |  37 +++--
 .../admin_toolbar_tools.info.yml              |   9 +-
 .../admin_toolbar_tools.install               |  20 +++
 .../admin_toolbar_tools.links.menu.yml        |   8 +-
 .../admin_toolbar_tools.routing.yml           |  10 +-
 .../install/admin_toolbar_tools.settings.yml  |   2 +
 .../schema/admin_toolbar_tools.schema.yml     |  10 ++
 .../admin_toolbar_tools/css/tools.css         |   1 +
 .../src/Controller/ToolbarController.php      |   2 +-
 .../Form/AdminToolbarToolsSettingsForm.php    | 111 +++++++++++++
 .../src/Plugin/Derivative/ExtraLinks.php      |  76 +++++++--
 .../src/Plugin/Menu/MenuLinkEntity.php        | 107 ++++++++++++
 .../Functional/AdminToolbarToolsAlterTest.php |   2 +-
 .../admin_toolbar/css/admin.toolbar.css       |  36 ++--
 .../css/admin.toolbar_search.css              |   8 +-
 .../admin_toolbar/js/admin_toolbar.hover.js   |  13 ++
 .../js/admin_toolbar.hoverintent.js           |  16 ++
 web/modules/admin_toolbar/js/admin_toolbar.js |  13 --
 .../src/Functional/AdminToolbarAlterTest.php  |   2 +-
 .../Functional/AdminToolbarToolsSortTest.php  | 108 +++++++-----
 39 files changed, 665 insertions(+), 391 deletions(-)
 delete mode 100755 web/modules/admin_toolbar/admin_toolbar_search/css/admin.toolbar_search.css.orig
 delete mode 100755 web/modules/admin_toolbar/admin_toolbar_search/js/admin_toolbar_search.js.orig
 create mode 100644 web/modules/admin_toolbar/admin_toolbar_tools/config/install/admin_toolbar_tools.settings.yml
 create mode 100644 web/modules/admin_toolbar/admin_toolbar_tools/config/schema/admin_toolbar_tools.schema.yml
 create mode 100644 web/modules/admin_toolbar/admin_toolbar_tools/src/Form/AdminToolbarToolsSettingsForm.php
 create mode 100644 web/modules/admin_toolbar/admin_toolbar_tools/src/Plugin/Menu/MenuLinkEntity.php
 create mode 100644 web/modules/admin_toolbar/js/admin_toolbar.hover.js
 create mode 100644 web/modules/admin_toolbar/js/admin_toolbar.hoverintent.js

diff --git a/composer.json b/composer.json
index 602e0bd9fb..77712c9658 100644
--- a/composer.json
+++ b/composer.json
@@ -87,7 +87,7 @@
         "desandro/masonry": "4.2",
         "dimsemenov/magnific-popup": "1.1",
         "drupal/addtocalendar": "3.2",
-        "drupal/admin_toolbar": "2.4",
+        "drupal/admin_toolbar": "3.0.2",
         "drupal/administerusersbyrole": "3.0",
         "drupal/allowed_formats": "1.3",
         "drupal/anchor_link": "1.7",
diff --git a/composer.lock b/composer.lock
index 4f6452429b..6b02e6248d 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "380fe9eca56285be5ea4b81288b6fd1f",
+    "content-hash": "d92afd65f29182ece4d6df27d3215b4d",
     "packages": [
         {
             "name": "alchemy/zippy",
@@ -1710,26 +1710,29 @@
         },
         {
             "name": "drupal/admin_toolbar",
-            "version": "2.4.0",
+            "version": "3.0.2",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/admin_toolbar.git",
-                "reference": "8.x-2.4"
+                "reference": "3.0.2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/admin_toolbar-8.x-2.4.zip",
-                "reference": "8.x-2.4",
-                "shasum": "6240047b8d91ac78f98d861ba8282af971fa0b38"
+                "url": "https://ftp.drupal.org/files/projects/admin_toolbar-3.0.2.zip",
+                "reference": "3.0.2",
+                "shasum": "a3b7a8030695d0c1d49ec57786321e2dd142184a"
             },
             "require": {
                 "drupal/core": "^8.8.0 || ^9.0"
             },
+            "require-dev": {
+                "drupal/admin_toolbar_tools": "*"
+            },
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "8.x-2.4",
-                    "datestamp": "1601999178",
+                    "version": "3.0.2",
+                    "datestamp": "1629907124",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
diff --git a/vendor/composer/InstalledVersions.php b/vendor/composer/InstalledVersions.php
index a7d4124c39..504e9a7f61 100644
--- a/vendor/composer/InstalledVersions.php
+++ b/vendor/composer/InstalledVersions.php
@@ -30,7 +30,7 @@ class InstalledVersions
     'aliases' => 
     array (
     ),
-    'reference' => '6c76100b0c87696bdb0c18fd35fa6fc265ab9aa9',
+    'reference' => 'f3b95f173473924fd6fc1d10d92240bd50ba3072',
     'name' => 'osu-asc-webservices/d8-upstream',
   ),
   'versions' => 
@@ -312,12 +312,12 @@ class InstalledVersions
     ),
     'drupal/admin_toolbar' => 
     array (
-      'pretty_version' => '2.4.0',
-      'version' => '2.4.0.0',
+      'pretty_version' => '3.0.2',
+      'version' => '3.0.2.0',
       'aliases' => 
       array (
       ),
-      'reference' => '8.x-2.4',
+      'reference' => '3.0.2',
     ),
     'drupal/administerusersbyrole' => 
     array (
@@ -2226,7 +2226,7 @@ class InstalledVersions
       'aliases' => 
       array (
       ),
-      'reference' => '6c76100b0c87696bdb0c18fd35fa6fc265ab9aa9',
+      'reference' => 'f3b95f173473924fd6fc1d10d92240bd50ba3072',
     ),
     'pantheon-systems/quicksilver-pushback' => 
     array (
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index f202a91f4f..143d5b3a7f 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -1751,27 +1751,30 @@
         },
         {
             "name": "drupal/admin_toolbar",
-            "version": "2.4.0",
-            "version_normalized": "2.4.0.0",
+            "version": "3.0.2",
+            "version_normalized": "3.0.2.0",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/admin_toolbar.git",
-                "reference": "8.x-2.4"
+                "reference": "3.0.2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/admin_toolbar-8.x-2.4.zip",
-                "reference": "8.x-2.4",
-                "shasum": "6240047b8d91ac78f98d861ba8282af971fa0b38"
+                "url": "https://ftp.drupal.org/files/projects/admin_toolbar-3.0.2.zip",
+                "reference": "3.0.2",
+                "shasum": "a3b7a8030695d0c1d49ec57786321e2dd142184a"
             },
             "require": {
                 "drupal/core": "^8.8.0 || ^9.0"
             },
+            "require-dev": {
+                "drupal/admin_toolbar_tools": "*"
+            },
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "8.x-2.4",
-                    "datestamp": "1601999178",
+                    "version": "3.0.2",
+                    "datestamp": "1629907124",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php
index a8a6cc6445..7028e1bb97 100644
--- a/vendor/composer/installed.php
+++ b/vendor/composer/installed.php
@@ -6,7 +6,7 @@
     'aliases' => 
     array (
     ),
-    'reference' => '6c76100b0c87696bdb0c18fd35fa6fc265ab9aa9',
+    'reference' => 'f3b95f173473924fd6fc1d10d92240bd50ba3072',
     'name' => 'osu-asc-webservices/d8-upstream',
   ),
   'versions' => 
@@ -288,12 +288,12 @@
     ),
     'drupal/admin_toolbar' => 
     array (
-      'pretty_version' => '2.4.0',
-      'version' => '2.4.0.0',
+      'pretty_version' => '3.0.2',
+      'version' => '3.0.2.0',
       'aliases' => 
       array (
       ),
-      'reference' => '8.x-2.4',
+      'reference' => '3.0.2',
     ),
     'drupal/administerusersbyrole' => 
     array (
@@ -2202,7 +2202,7 @@
       'aliases' => 
       array (
       ),
-      'reference' => '6c76100b0c87696bdb0c18fd35fa6fc265ab9aa9',
+      'reference' => 'f3b95f173473924fd6fc1d10d92240bd50ba3072',
     ),
     'pantheon-systems/quicksilver-pushback' => 
     array (
diff --git a/web/modules/admin_toolbar/README.txt b/web/modules/admin_toolbar/README.txt
index 46c2929a6f..110c238e28 100755
--- a/web/modules/admin_toolbar/README.txt
+++ b/web/modules/admin_toolbar/README.txt
@@ -50,7 +50,7 @@ INSTALLATION
 CONFIGURATION
 -------------
 
-No configuration is needed.
+ * Configure the admin toolbar tools at (/admin/config/user-interface/settings).
 
 
 MAINTAINERS
diff --git a/web/modules/admin_toolbar/admin_toolbar.info.yml b/web/modules/admin_toolbar/admin_toolbar.info.yml
index 983bef388c..6d6b70d1de 100644
--- a/web/modules/admin_toolbar/admin_toolbar.info.yml
+++ b/web/modules/admin_toolbar/admin_toolbar.info.yml
@@ -1,14 +1,12 @@
 name: Admin Toolbar
 description: Provides an improved drop-down menu interface to the site Toolbar.
 package: Administration
-
 type: module
-core_version_requirement: ^8.8.0 || ^9.0
-
+core_version_requirement: ^8.8.0 || ^9
 dependencies:
   - drupal:toolbar
 
-# Information added by Drupal.org packaging script on 2020-10-06
-version: '8.x-2.4'
+# Information added by Drupal.org packaging script on 2021-08-25
+version: '3.0.2'
 project: 'admin_toolbar'
-datestamp: 1601998855
+datestamp: 1629882676
diff --git a/web/modules/admin_toolbar/admin_toolbar.libraries.yml b/web/modules/admin_toolbar/admin_toolbar.libraries.yml
index 85b322a4e6..7dc0448de5 100755
--- a/web/modules/admin_toolbar/admin_toolbar.libraries.yml
+++ b/web/modules/admin_toolbar/admin_toolbar.libraries.yml
@@ -3,8 +3,19 @@ toolbar.tree:
     theme:
       css/admin.toolbar.css: {}
   js:
-    js/jquery.hoverIntent.js: {}
     js/admin_toolbar.js: {}
   dependencies:
     - core/jquery
     - core/drupal
+toolbar.tree.hoverintent:
+  js:
+    js/jquery.hoverIntent.js: {}
+    js/admin_toolbar.hoverintent.js: {}
+  dependencies:
+    - core/jquery
+
+toolbar.tree.hover:
+  js:
+    js/admin_toolbar.hover.js: {}
+  dependencies:
+    - core/jquery
diff --git a/web/modules/admin_toolbar/admin_toolbar.module b/web/modules/admin_toolbar/admin_toolbar.module
index c02c3f4868..2b32b57995 100755
--- a/web/modules/admin_toolbar/admin_toolbar.module
+++ b/web/modules/admin_toolbar/admin_toolbar.module
@@ -16,6 +16,15 @@
 function admin_toolbar_toolbar_alter(&$items) {
   $items['administration']['tray']['toolbar_administration']['#pre_render'] = [[AdminToolbar::class, 'preRenderTray']];
   $items['administration']['#attached']['library'][] = 'admin_toolbar/toolbar.tree';
+  $hoverintent_functionality = \Drupal::config('admin_toolbar_tools.settings')->get('hoverintent_functionality');
+  if ($hoverintent_functionality === TRUE) {
+  // Use jQuery hover() effect.
+  $items['administration']['#attached']['library'][] = 'admin_toolbar/toolbar.tree.hoverintent';
+  }
+  else {
+    // User hoverIntent plugin.
+    $items['administration']['#attached']['library'][] = 'admin_toolbar/toolbar.tree.hover';
+  }
 }
 
 /**
diff --git a/web/modules/admin_toolbar/admin_toolbar_links_access_filter/admin_toolbar_links_access_filter.info.yml b/web/modules/admin_toolbar/admin_toolbar_links_access_filter/admin_toolbar_links_access_filter.info.yml
index 1e3882867e..3751d83ac0 100644
--- a/web/modules/admin_toolbar/admin_toolbar_links_access_filter/admin_toolbar_links_access_filter.info.yml
+++ b/web/modules/admin_toolbar/admin_toolbar_links_access_filter/admin_toolbar_links_access_filter.info.yml
@@ -8,7 +8,7 @@ core_version_requirement: ^8.8.0 || ^9.0
 dependencies:
   - admin_toolbar:admin_toolbar
 
-# Information added by Drupal.org packaging script on 2020-10-06
-version: '8.x-2.4'
+# Information added by Drupal.org packaging script on 2021-08-25
+version: '3.0.2'
 project: 'admin_toolbar'
-datestamp: 1601998855
+datestamp: 1629882676
diff --git a/web/modules/admin_toolbar/admin_toolbar_links_access_filter/admin_toolbar_links_access_filter.module b/web/modules/admin_toolbar/admin_toolbar_links_access_filter/admin_toolbar_links_access_filter.module
index 2aff07f402..a415d13620 100755
--- a/web/modules/admin_toolbar/admin_toolbar_links_access_filter/admin_toolbar_links_access_filter.module
+++ b/web/modules/admin_toolbar/admin_toolbar_links_access_filter/admin_toolbar_links_access_filter.module
@@ -58,8 +58,8 @@ function admin_toolbar_links_access_filter_preprocess_menu(&$variables) {
  * Hides links from admin menu, if user doesn't have access rights.
  */
 function admin_toolbar_links_access_filter_filter_non_accessible_links(array &$items) {
-  foreach ($items as $route => &$item) {
-    $route_name = $route;
+  foreach ($items as $menu_id => &$item) {
+    $route_name = NULL;
     $route_params = [];
     if (!empty($item['original_link'])) {
       /** @var \Drupal\Core\Menu\MenuLinkBase $original_link */
@@ -71,18 +71,28 @@ function admin_toolbar_links_access_filter_filter_non_accessible_links(array &$i
       $route_name = $original_link->getRouteName();
       $route_params = $original_link->getRouteParameters();
     }
+    elseif (!empty($item['url'])) {
+      /** @var \Drupal\Core\Url $url */
+      $url = $item['url'];
+      if ($url->isExternal()) {
+        // Do not filter external URL at all.
+        continue;
+      }
+      $route_name = $url->getRouteName();
+      $route_params = $url->getRouteParameters();
+    }
 
     // Check, if user has access rights to the route.
     if (!\Drupal::accessManager()
       ->checkNamedRoute($route_name, $route_params)) {
-      unset($items[$route]);
+      unset($items[$menu_id]);
     }
     else {
-      if (!empty($items[$route]['below'])) {
+      if (!empty($items[$menu_id]['below'])) {
         // Recursively call this function for the child items.
-        admin_toolbar_links_access_filter_filter_non_accessible_links($items[$route]['below']);
+        admin_toolbar_links_access_filter_filter_non_accessible_links($items[$menu_id]['below']);
       }
-      if (empty($items[$route]['below']) && \Drupal::moduleHandler()
+      if (empty($items[$menu_id]['below']) && \Drupal::moduleHandler()
         ->moduleExists('admin_toolbar')) {
 
         // Every child item has been cleared out.
@@ -91,12 +101,17 @@ function admin_toolbar_links_access_filter_filter_non_accessible_links(array &$i
         // unset this item, as there aren't any children left.
         // This assumption is only valid, when the admin_toolbar module is
         // installed because otherwise we won't have child items at all.
-        if (admin_toolbar_links_access_filter_is_overview_page($route)) {
-          unset($items[$route]);
+        if (admin_toolbar_links_access_filter_is_overview_page($route_name)) {
+          unset($items[$menu_id]);
+        }
+        // If there are no sub-items and the parent does not have a link, then
+        // it is safe to remove it.
+        elseif ($route_name === '<nolink>') {
+          unset($items[$menu_id]);
         }
         else {
           // Let's remove the expanded flag.
-          $items[$route]['is_expanded'] = FALSE;
+          $items[$menu_id]['is_expanded'] = FALSE;
         }
       }
     }
diff --git a/web/modules/admin_toolbar/admin_toolbar_search/admin_toolbar_search.info.yml b/web/modules/admin_toolbar/admin_toolbar_search/admin_toolbar_search.info.yml
index 462a5ad513..2536e7a0c1 100644
--- a/web/modules/admin_toolbar/admin_toolbar_search/admin_toolbar_search.info.yml
+++ b/web/modules/admin_toolbar/admin_toolbar_search/admin_toolbar_search.info.yml
@@ -1,14 +1,12 @@
 name: Admin Toolbar Search
 description: Provides search of Admin Toolbar items.
 package: Administration
-
 type: module
 core_version_requirement: ^8.8.0 || ^9.0
-
 dependencies:
-  - admin_toolbar:admin_toolbar
+  - admin_toolbar:admin_toolbar_tools
 
-# Information added by Drupal.org packaging script on 2020-10-06
-version: '8.x-2.4'
+# Information added by Drupal.org packaging script on 2021-08-25
+version: '3.0.2'
 project: 'admin_toolbar'
-datestamp: 1601998855
+datestamp: 1629882676
diff --git a/web/modules/admin_toolbar/admin_toolbar_search/admin_toolbar_search.services.yml b/web/modules/admin_toolbar/admin_toolbar_search/admin_toolbar_search.services.yml
index 977e6ce2c3..12950ea112 100644
--- a/web/modules/admin_toolbar/admin_toolbar_search/admin_toolbar_search.services.yml
+++ b/web/modules/admin_toolbar/admin_toolbar_search/admin_toolbar_search.services.yml
@@ -7,3 +7,4 @@ services:
      - '@router.route_provider'
      - '@cache_contexts_manager'
      - '@cache.toolbar'
+     - '@config.factory'
diff --git a/web/modules/admin_toolbar/admin_toolbar_search/css/admin.toolbar_search.css b/web/modules/admin_toolbar/admin_toolbar_search/css/admin.toolbar_search.css
index d12e95bbbf..4e7b028d0d 100755
--- a/web/modules/admin_toolbar/admin_toolbar_search/css/admin.toolbar_search.css
+++ b/web/modules/admin_toolbar/admin_toolbar_search/css/admin.toolbar_search.css
@@ -4,7 +4,8 @@
 }
 
 #admin-toolbar-search-input {
-  min-height: 1rem;
+  min-height: 30px;
+  height: 100%;
   padding: 0 0.4rem;
   line-height: 1.75rem;
   margin: 0;
diff --git a/web/modules/admin_toolbar/admin_toolbar_search/css/admin.toolbar_search.css.orig b/web/modules/admin_toolbar/admin_toolbar_search/css/admin.toolbar_search.css.orig
deleted file mode 100755
index 3be4d4e705..0000000000
--- a/web/modules/admin_toolbar/admin_toolbar_search/css/admin.toolbar_search.css.orig
+++ /dev/null
@@ -1,20 +0,0 @@
-#admin-toolbar-search-tab .js-form-item.form-item {
-  margin-top: 0.3rem;
-  margin-bottom: 0;
-}
-
-#admin-toolbar-search-input {
-  min-height: 1rem;
-  padding: 0 0.4rem;
-  line-height: 1.75rem;
-  margin: 0;
-  color: #3b3b3b;
-  background: #fcfcfa;
-  border: 1px solid #ccc;
-  border-radius: unset;
-  font-size: 1em;
-}
-
-.ui-autocomplete .ui-menu-item span.admin-toolbar-search-url {
-  color: rgba(0, 0, 0, 0.50);
-}
diff --git a/web/modules/admin_toolbar/admin_toolbar_search/js/admin_toolbar_search.js b/web/modules/admin_toolbar/admin_toolbar_search/js/admin_toolbar_search.js
index 975f3b4a06..721da1f7c4 100755
--- a/web/modules/admin_toolbar/admin_toolbar_search/js/admin_toolbar_search.js
+++ b/web/modules/admin_toolbar/admin_toolbar_search/js/admin_toolbar_search.js
@@ -58,7 +58,7 @@
       }).data("ui-autocomplete")._renderItem = (function (ul, item) {
         ul.addClass('admin-toolbar-search-autocomplete-list');
         return $("<li>")
-          .append('<div>' + item.labelRaw + ' <span class="admin-toolbar-search-url">' + item.value + '</span></div>')
+          .append('<div>' + item.labelRaw + '<span class="admin-toolbar-search-url">' + '</span></div>')
           .appendTo(ul);
       });
 
@@ -124,7 +124,7 @@
             $self.links.push({
               'value': this.href,
               'label': label + ' ' + this.href,
-              'labelRaw': label
+              'labelRaw': Drupal.checkPlain(label)
             });
           }
         });
diff --git a/web/modules/admin_toolbar/admin_toolbar_search/js/admin_toolbar_search.js.orig b/web/modules/admin_toolbar/admin_toolbar_search/js/admin_toolbar_search.js.orig
deleted file mode 100755
index 110040741e..0000000000
--- a/web/modules/admin_toolbar/admin_toolbar_search/js/admin_toolbar_search.js.orig
+++ /dev/null
@@ -1,134 +0,0 @@
-/**
- * @file
- * Behaviors for the search widget in the admin toolbar.
- */
-
-(function ($, Drupal) {
-
-  'use strict';
-
-  Drupal.behaviors.adminToolbarSearch = {
-
-    // If extra links have been fetched.
-    extraFetched: false,
-
-    attach: function (context) {
-      if (context != document) {
-        return;
-      }
-
-      var $self = this;
-      this.links = [];
-
-      $("#admin-toolbar-search-input").autocomplete({
-        minLength: 2,
-        source: function (request, response) {
-          var data = $self.handleAutocomplete(request.term);
-          if (!$self.extraFetched && drupalSettings.adminToolbarSearch.loadExtraLinks) {
-            $.getJSON( "/admin/admin-toolbar-search", function( data ) {
-              $(data).each(function() {
-                var item = this;
-                item.label = this.labelRaw + ' ' + this.value;
-                $self.links.push(item);
-              });
-
-              $self.extraFetched = true;
-
-              var results = $self.handleAutocomplete(request.term);
-              response(results);
-            });
-          }
-          else {
-            response(data);
-          }
-        },
-        open: function () {
-          var zIndex = $('#toolbar-item-administration-tray')
-            .css("z-index") + 1;
-          $(this).autocomplete('widget').css('z-index', zIndex);
-
-          return false;
-        },
-        select: function (event, ui) {
-          if (ui.item.value) {
-            location.href = ui.item.value;
-            return false;
-          }
-        }
-      }).data("ui-autocomplete")._renderItem = (function (ul, item) {
-        return $("<li>")
-          .append('<div>' + item.labelRaw + ' <span class="admin-toolbar-search-url">' + item.value + '</span></div>')
-          .appendTo(ul);
-      });
-
-      // Populate the links for search results when the input is pressed.
-      $(context).find('#admin-toolbar-search-input')
-        .once('admin_toolbar_search')
-        .each(function () {
-          $(this).focus(function() {
-            Drupal.behaviors.adminToolbarSearch.populateLinks($self);
-          });
-        });
-    },
-    getItemLabel: function (item) {
-      var breadcrumbs = [];
-      $(item).parents().each(function () {
-        if ($(this).hasClass('menu-item')) {
-          var $link = $(this).find('a:first');
-          if ($link.length && !$link.hasClass('admin-toolbar-search-ignore')) {
-            breadcrumbs.unshift($link.text());
-          }
-        }
-      });
-      return breadcrumbs.join(' > ');
-    },
-    handleAutocomplete: function (term) {
-      var $self = this;
-      var keywords = term.split(" "); // Split search terms into list.
-
-      var suggestions = [];
-      $self.links.forEach(function (element) {
-        var label = element.label.toLowerCase();
-
-        // Add exact matches.
-        if (label.indexOf(term.toLowerCase()) >= 0) {
-          suggestions.push(element);
-        }
-        else {
-          // Add suggestions where it matches all search terms.
-          var matchCount = 0;
-          keywords.forEach(function (keyword) {
-            if (label.indexOf(keyword.toLowerCase()) >= 0) {
-              matchCount++;
-            }
-          });
-          if (matchCount == keywords.length) {
-            suggestions.push(element);
-          }
-        }
-      });
-      return suggestions;
-    },
-    /**
-     * Populates the links in admin toolbar search.
-     */
-    populateLinks: function ($self) {
-      // Populate only when links array is empty (only the first time).
-      if ($self.links.length === 0) {
-        var getUrl = window.location;
-        var baseUrl = getUrl.protocol + "//" + getUrl.host + "/";
-        $('.toolbar-tray a[data-drupal-link-system-path]').each(function () {
-          if (this.href !== baseUrl) {
-            var label = $self.getItemLabel(this);
-            $self.links.push({
-              'value': this.href,
-              'label': label + ' ' + this.href,
-              'labelRaw': label
-            });
-          }
-        });
-      }
-    },
-  };
-
-})(jQuery, Drupal);
diff --git a/web/modules/admin_toolbar/admin_toolbar_search/src/SearchLinks.php b/web/modules/admin_toolbar/admin_toolbar_search/src/SearchLinks.php
index e36dba37a9..cff509f40d 100644
--- a/web/modules/admin_toolbar/admin_toolbar_search/src/SearchLinks.php
+++ b/web/modules/admin_toolbar/admin_toolbar_search/src/SearchLinks.php
@@ -2,10 +2,10 @@
 
 namespace Drupal\admin_toolbar_search;
 
-use Drupal\admin_toolbar_tools\Plugin\Derivative\ExtraLinks;
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Cache\CacheBackendInterface;
 use Drupal\Core\Cache\Context\CacheContextsManager;
+use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Language\LanguageInterface;
@@ -56,6 +56,13 @@ class SearchLinks {
    */
   protected $toolbarCache;
 
+  /**
+   * The admin toolbar tools configuration.
+   *
+   * @var \Drupal\Core\Config\Config
+   */
+  protected $config;
+
   /**
    * Constructs a SearchLinks object.
    *
@@ -69,13 +76,16 @@ class SearchLinks {
    *   The cache contexts manager.
    * @param \Drupal\Core\Cache\CacheBackendInterface $toolbar_cache
    *   Cache backend instance to use.
+   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
+   *   Config factory mservice.
    */
-  public function __construct(EntityTypeManagerInterface $entity_type_manager, ModuleHandlerInterface $module_handler, RouteProviderInterface $route_provider, CacheContextsManager $cache_context_manager, CacheBackendInterface $toolbar_cache) {
+  public function __construct(EntityTypeManagerInterface $entity_type_manager, ModuleHandlerInterface $module_handler, RouteProviderInterface $route_provider, CacheContextsManager $cache_context_manager, CacheBackendInterface $toolbar_cache, ConfigFactoryInterface $config_factory) {
     $this->entityTypeManager = $entity_type_manager;
     $this->moduleHandler = $module_handler;
     $this->routeProvider = $route_provider;
     $this->cacheContextManager = $cache_context_manager;
     $this->toolbarCache = $toolbar_cache;
+    $this->config = $config_factory->get('admin_toolbar_tools.settings');
   }
 
   /**
@@ -88,6 +98,7 @@ public function __construct(EntityTypeManagerInterface $entity_type_manager, Mod
    * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
    */
   public function getLinks() {
+    $max_bundle_number = $this->config->get('max_bundle_number');
     $additional_keys = $this->cacheContextManager->convertTokensToKeys([
       'languages:' . LanguageInterface::TYPE_INTERFACE,
       'user.permissions',
@@ -107,9 +118,9 @@ public function getLinks() {
     foreach ($content_entities as $entities) {
       $content_entity_bundle = $entities['content_entity_bundle'];
       $content_entity = $entities['content_entity'];
-      // Start at offset 10, since the toolbar has already loaded the first 10.
+      // Load the remaining items that were not loaded by the toolbar.
       $content_entity_bundle_storage = $this->entityTypeManager->getStorage($content_entity_bundle);
-      $bundles_ids = $content_entity_bundle_storage->getQuery()->range(ExtraLinks::MAX_BUNDLE_NUMBER)->execute();
+      $bundles_ids = $content_entity_bundle_storage->getQuery()->range($max_bundle_number)->execute();
       if (!empty($bundles_ids)) {
         $bundles = $this->entityTypeManager
           ->getStorage($content_entity_bundle)
@@ -126,62 +137,75 @@ public function getLinks() {
             // Some bundles have an overview/list form that make a better root
             // link.
             $url = Url::fromRoute('entity.' . $content_entity_bundle . '.overview_form', $params);
-            $url_string = $url->toString();
-            $links[] = [
-              'labelRaw' => $label_base,
-              'value' => $url_string,
-            ];
+            if ($url->access()) {
+              $url_string = $url->toString();
+              $links[] = [
+                'labelRaw' => $label_base,
+                'value' => $url_string,
+              ];
+            }
           }
           if ($this->routeExists('entity.' . $content_entity_bundle . '.edit_form')) {
             $url = Url::fromRoute('entity.' . $content_entity_bundle . '.edit_form', $params);
-            $url_string = $url->toString();
-            $links[] = [
-              'labelRaw' => $label_base . ' > ' . $this->t('Edit'),
-              'value' => $url_string,
-            ];
-          }
-          if ($this->moduleHandler->moduleExists('field_ui')) {
-            if ($this->routeExists('entity.' . $content_entity . '.field_ui_fields')) {
-              $url = Url::fromRoute('entity.' . $content_entity . '.field_ui_fields', $params);
+            if ($url->access()) {
               $url_string = $url->toString();
               $links[] = [
-                'labelRaw' => $label_base . ' > ' . $this->t('Manage fields'),
+                'labelRaw' => $label_base . ' > ' . $this->t('Edit'),
                 'value' => $url_string,
               ];
             }
+          }
+          if ($this->moduleHandler->moduleExists('field_ui')) {
+            if ($this->routeExists('entity.' . $content_entity . '.field_ui_fields')) {
+              $url = Url::fromRoute('entity.' . $content_entity . '.field_ui_fields', $params);
+              if ($url->access()) {
+                $url_string = $url->toString();
+                $links[] = [
+                  'labelRaw' => $label_base . ' > ' . $this->t('Manage fields'),
+                  'value' => $url_string,
+                ];
+              }
+            }
 
             if ($this->routeExists('entity.entity_form_display.' . $content_entity . '.default')) {
               $url = Url::fromRoute('entity.entity_form_display.' . $content_entity . '.default', $params);
-              $url_string = $url->toString();
-              $links[] = [
-                'labelRaw' => $label_base . ' > ' . $this->t('Manage form display'),
-                'value' => $url_string,
-              ];
-
+              if ($url->access()) {
+                $url_string = $url->toString();
+                $links[] = [
+                  'labelRaw' => $label_base . ' > ' . $this->t('Manage form display'),
+                  'value' => $url_string,
+                ];
+              }
             }
             if ($this->routeExists('entity.entity_view_display.' . $content_entity . '.default')) {
               $url = Url::fromRoute('entity.entity_view_display.' . $content_entity . '.default', $params);
-              $url_string = $url->toString();
-              $links[] = [
-                'labelRaw' => $label_base . ' > ' . $this->t('Manage display'),
-                'value' => $url_string,
-              ];
+              if ($url->access()) {
+                $url_string = $url->toString();
+                $links[] = [
+                  'labelRaw' => $label_base . ' > ' . $this->t('Manage display'),
+                  'value' => $url_string,
+                ];
+              }
             }
             if ($this->moduleHandler->moduleExists('devel') && $this->routeExists('entity.' . $content_entity_bundle . '.devel_load')) {
               $url = Url::fromRoute($route_name = 'entity.' . $content_entity_bundle . '.devel_load', $params);
-              $url_string = $url->toString();
-              $links[] = [
-                'labelRaw' => $label_base . ' > ' . $this->t('Devel'),
-                'value' => $url_string,
-              ];
+              if ($url->access()) {
+                $url_string = $url->toString();
+                $links[] = [
+                  'labelRaw' => $label_base . ' > ' . $this->t('Devel'),
+                  'value' => $url_string,
+                ];
+              }
             }
             if ($this->routeExists('entity.' . $content_entity_bundle . '.delete_form')) {
               $url = Url::fromRoute('entity.' . $content_entity_bundle . '.delete_form', $params);
-              $url_string = $url->toString();
-              $links[] = [
-                'labelRaw' => $label_base . ' > ' . $this->t('Delete'),
-                'value' => $url_string,
-              ];
+              if ($url->access()) {
+                $url_string = $url->toString();
+                $links[] = [
+                  'labelRaw' => $label_base . ' > ' . $this->t('Delete'),
+                  'value' => $url_string,
+                ];
+              }
             }
           }
         }
@@ -193,29 +217,33 @@ public function getLinks() {
 
       $menus = $this->entityTypeManager->getStorage('menu')->loadMultiple();
       uasort($menus, [Menu::class, 'sort']);
-      $menus = array_slice($menus, ExtraLinks::MAX_BUNDLE_NUMBER);
+      $menus = array_slice($menus, $max_bundle_number);
 
       $cache_tags = Cache::mergeTags($cache_tags, ['config:menu_list']);
       foreach ($menus as $menu_id => $menu) {
         $route_name = 'entity.menu.edit_form';
         $params = ['menu' => $menu_id];
         $url = Url::fromRoute($route_name, $params);
-        $url_string = $url->toString();
+        if ($url->access()) {
+          $url_string = $url->toString();
 
-        $links[] = [
-          'labelRaw' => $this->t('Menus') . ' > ' . $menu->label(),
-          'value' => $url_string,
-        ];
+          $links[] = [
+            'labelRaw' => $this->t('Menus > @menu_label', ['@menu_label' => $menu->label()]),
+            'value' => $url_string,
+          ];
+        }
 
         $route_name = 'entity.menu.add_link_form';
         $params = ['menu' => $menu_id];
         $url = Url::fromRoute($route_name, $params);
-        $url_string = $url->toString();
+        if ($url->access()) {
+          $url_string = $url->toString();
 
-        $links[] = [
-          'labelRaw' => $this->t('Menus') . ' > ' . $menu->label() . ' > ' . $this->t('Add link'),
-          'value' => $url_string,
-        ];
+          $links[] = [
+            'labelRaw' => $this->t('Menus > @menu_label > ', ['@menu_label' => $menu->label()]) . $this->t('Add link'),
+            'value' => $url_string,
+          ];
+        }
 
         $menus = ['admin', 'devel', 'footer', 'main', 'tools', 'account'];
         if (!in_array($menu_id, $menus)) {
@@ -223,23 +251,27 @@ public function getLinks() {
           $route_name = 'entity.menu.delete_form';
           $params = ['menu' => $menu_id];
           $url = Url::fromRoute($route_name, $params);
-          $url_string = $url->toString();
+          if ($url->access()) {
+            $url_string = $url->toString();
 
-          $links[] = [
-            'labelRaw' => $this->t('Menus') . ' > ' . $menu->label() . ' > ' . $this->t('Delete'),
-            'value' => $url_string,
-          ];
+            $links[] = [
+              'labelRaw' => $this->t('Menus > @menu_label > ', ['@menu_label' => $menu->label()]) . $this->t('Delete'),
+              'value' => $url_string,
+            ];
+          }
         }
         if ($this->moduleHandler->moduleExists('devel') && $this->routeExists('entity.menu.devel_load')) {
           $route_name = 'entity.menu.devel_load';
           $params = ['menu' => $menu_id];
           $url = Url::fromRoute($route_name, $params);
-          $url_string = $url->toString();
+          if ($url->access()) {
+            $url_string = $url->toString();
 
-          $links[] = [
-            'labelRaw' => $this->t('Menus') . ' > ' . $menu->label() . ' > ' . $this->t('Devel'),
-            'value' => $url_string,
-          ];
+            $links[] = [
+              'labelRaw' => $this->t('Menus > @menu_label > ', ['@menu_label' => $menu->label()]) . $this->t('Devel'),
+              'value' => $url_string,
+            ];
+          }
         }
       }
     }
diff --git a/web/modules/admin_toolbar/admin_toolbar_search/tests/src/FunctionalJavascript/AdminToolbarSearchTestBase.php b/web/modules/admin_toolbar/admin_toolbar_search/tests/src/FunctionalJavascript/AdminToolbarSearchTestBase.php
index 6a16c5882e..8738781051 100755
--- a/web/modules/admin_toolbar/admin_toolbar_search/tests/src/FunctionalJavascript/AdminToolbarSearchTestBase.php
+++ b/web/modules/admin_toolbar/admin_toolbar_search/tests/src/FunctionalJavascript/AdminToolbarSearchTestBase.php
@@ -21,7 +21,7 @@ abstract class AdminToolbarSearchTestBase extends WebDriverTestBase {
   /**
    * {@inheritdoc}
    */
-  public static $modules = [
+  protected static $modules = [
     'admin_toolbar_search',
     'node',
     'media',
@@ -47,7 +47,7 @@ abstract class AdminToolbarSearchTestBase extends WebDriverTestBase {
   /**
    * {@inheritdoc}
    */
-  public function setUp() {
+  public function setUp(): void {
     parent::setUp();
 
     $baby_names = [
@@ -119,7 +119,7 @@ protected function assertSuggestionContains($search, $contains) {
       return ($page->find('css', 'ul.ui-autocomplete')->isVisible() === TRUE);
     });
     $suggestions_markup = $page->find('css', 'ul.ui-autocomplete')->getHtml();
-    $this->assertContains($contains, $suggestions_markup);
+    $this->assertStringContainsString($contains, $suggestions_markup);
   }
 
   /**
diff --git a/web/modules/admin_toolbar/admin_toolbar_search/tests/src/FunctionalJavascript/AdminToolbarToolsSearchTest.php b/web/modules/admin_toolbar/admin_toolbar_search/tests/src/FunctionalJavascript/AdminToolbarToolsSearchTest.php
index 84604bc077..b1bf1173ef 100755
--- a/web/modules/admin_toolbar/admin_toolbar_search/tests/src/FunctionalJavascript/AdminToolbarToolsSearchTest.php
+++ b/web/modules/admin_toolbar/admin_toolbar_search/tests/src/FunctionalJavascript/AdminToolbarToolsSearchTest.php
@@ -18,7 +18,7 @@ class AdminToolbarToolsSearchTest extends AdminToolbarSearchTestBase {
   /**
    * {@inheritdoc}
    */
-  public static $modules = [
+  protected static $modules = [
     'admin_toolbar_tools',
     'admin_toolbar_search',
     'node',
@@ -38,7 +38,7 @@ class AdminToolbarToolsSearchTest extends AdminToolbarSearchTestBase {
   /**
    * {@inheritdoc}
    */
-  public function setUp() {
+  public function setUp(): void {
     parent::setUp();
 
     $this->drupalCreateContentType([
@@ -67,6 +67,16 @@ public function setUp() {
       'ruby' => 'Ruby',
       'teddy' => 'Teddy',
       'toby' => 'Toby',
+      'tonga' => 'Tonga',
+      'tracey' => 'Tracey',
+      'tuna' => 'Tuna',
+      'uno' => 'Uno',
+      'venus' => 'Venus',
+      'vicky' => 'Vicky',
+      'wimpy' => 'Wimpy',
+      'yellow' => 'Yellow',
+      'zac' => 'zac',
+      'zora' => 'zora',
     ];
 
     foreach ($dog_names as $machine_name => $label) {
@@ -118,15 +128,6 @@ public function testToolbarSearch() {
     $this->drupalGet('/admin/admin-toolbar-search');
 
     $search_menus = [
-      'cora',
-      'eleanor',
-      'eloise',
-      'felix',
-      'freya',
-      'genevieve',
-      'isla',
-      'jasper',
-      'luna',
       'maeve',
       'milo',
       'nora',
@@ -184,12 +185,12 @@ public function testToolbarSearch() {
     // Test that bundle within admin toolbar appears in search.
     $this->assertSuggestionContains('lola', 'admin/structure/media/manage/lola/fields');
 
-    // Assert that a link after the limit (10) doesn't appear in admin toolbar.
-    $toby_url = '/admin/structure/media/manage/toby/fields';
-    $assert_session->elementNotContains('css', '#toolbar-administration', $toby_url);
+    // Assert that a link after the limit doesn't appear in admin toolbar.
+    $zora_url = '/admin/structure/media/manage/zora/fields';
+    $assert_session->elementNotContains('css', '#toolbar-administration', $zora_url);
 
     // Assert that a link excluded from admin toolbar appears in search.
-    $this->assertSuggestionContains('toby', $toby_url);
+    $this->assertSuggestionContains('zora', $zora_url);
 
     // Test that adding a new bundle updates the extra links loaded from
     // admin_toolbar.search route.
@@ -204,12 +205,12 @@ public function testToolbarSearch() {
 
     // Test that deleting a bundle updates the extra links loaded from
     // admin_toolbar.search route.
-    $toby = MediaType::load('toby');
-    $toby->delete();
+    $zora = MediaType::load('zora');
+    $zora->delete();
 
     $this->getSession()->reload();
     $assert_session->waitForElementVisible('css', $search_tray);
-    $this->assertSuggestionNotContains('toby', $toby_url);
+    $this->assertSuggestionNotContains('zora', $zora);
   }
 
 }
diff --git a/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.info.yml b/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.info.yml
index 73cc5d7b0a..1bfd11c27a 100644
--- a/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.info.yml
+++ b/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.info.yml
@@ -1,14 +1,13 @@
 name: Admin Toolbar Extra Tools
 description: Adds menu links like Flush cache, Run cron, Run updates, and Logout under Drupal icon.
 package: Administration
-
+configure: admin_toolbar_tools.settings
 type: module
 core_version_requirement: ^8.8.0 || ^9.0
-
 dependencies:
   - admin_toolbar:admin_toolbar
 
-# Information added by Drupal.org packaging script on 2020-10-06
-version: '8.x-2.4'
+# Information added by Drupal.org packaging script on 2021-08-25
+version: '3.0.2'
 project: 'admin_toolbar'
-datestamp: 1601998855
+datestamp: 1629882676
diff --git a/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.install b/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.install
index 1cc14c73d3..fae84ba5cd 100644
--- a/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.install
+++ b/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.install
@@ -12,3 +12,23 @@ function admin_toolbar_tools_update_8001() {
   // Installing the Admin Toolbar Search module.
   \Drupal::service('module_installer')->install(['admin_toolbar_search']);
 }
+
+/**
+ * Default setting for maximum number of bundles per entity type to display.
+ */
+function admin_toolbar_tools_update_8201() {
+  \Drupal::service('config.factory')
+    ->getEditable('admin_toolbar_tools.settings')
+    ->set('max_bundle_number', 20)
+    ->save(TRUE);
+}
+
+/**
+ * Default setting for enable hoverintent.
+ */
+function admin_toolbar_tools_update_8202() {
+  \Drupal::service('config.factory')
+    ->getEditable('admin_toolbar_tools.settings')
+    ->set('hoverintent_functionality', TRUE)
+    ->save(TRUE);
+}
diff --git a/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.links.menu.yml b/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.links.menu.yml
index 670a4f76c6..7b006bae4f 100755
--- a/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.links.menu.yml
+++ b/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.links.menu.yml
@@ -40,7 +40,7 @@ admin_toolbar_tools.flush:
   menu_name: admin
 
 admin_toolbar_tools.cssjs:
-  title: 'Flush CSS and Javascript'
+  title: 'Flush CSS and JavaScript'
   route_name: admin_toolbar_tools.cssjs
   parent: admin_toolbar_tools.flush
   menu_name: admin
@@ -84,3 +84,9 @@ admin_toolbar_tools.theme_rebuild:
 admin_toolbar_tools.extra_links:
   deriver: \Drupal\admin_toolbar_tools\Plugin\Derivative\ExtraLinks
   menu_name: admin
+
+admin_toolbar_tools.settings:
+  title: 'Admin Toolbar Tools'
+  description: 'Configure the Admin Toolbar Tools module.'
+  route_name: admin_toolbar_tools.settings
+  parent: system.admin_config_ui
diff --git a/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.routing.yml b/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.routing.yml
index bcae9db1b7..e5a0bfd5dc 100755
--- a/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.routing.yml
+++ b/web/modules/admin_toolbar/admin_toolbar_tools/admin_toolbar_tools.routing.yml
@@ -11,7 +11,7 @@ admin_toolbar_tools.cssjs:
   path: '/admin/flush/cssjs'
   defaults:
     _controller: '\Drupal\admin_toolbar_tools\Controller\ToolbarController::flushJsCss'
-    _title: 'Flush Css and Javascript'
+    _title: 'Flush CSS and JavaScript'
   requirements:
     _permission: 'administer site configuration'
     _csrf_token: 'TRUE'
@@ -87,3 +87,11 @@ admin_toolbar.run.cron:
   requirements:
     _permission: 'administer site configuration'
     _csrf_token: 'TRUE'
+
+admin_toolbar_tools.settings:
+  path: '/admin/config/user-interface/admin-toolbar-tools'
+  defaults:
+    _form: '\Drupal\admin_toolbar_tools\Form\AdminToolbarToolsSettingsForm'
+    _title: 'Admin Toolbar Tools settings'
+  requirements:
+    _permission: 'administer site configuration'
diff --git a/web/modules/admin_toolbar/admin_toolbar_tools/config/install/admin_toolbar_tools.settings.yml b/web/modules/admin_toolbar/admin_toolbar_tools/config/install/admin_toolbar_tools.settings.yml
new file mode 100644
index 0000000000..2f4de2018d
--- /dev/null
+++ b/web/modules/admin_toolbar/admin_toolbar_tools/config/install/admin_toolbar_tools.settings.yml
@@ -0,0 +1,2 @@
+max_bundle_number: 20
+hoverintent_functionality: true
diff --git a/web/modules/admin_toolbar/admin_toolbar_tools/config/schema/admin_toolbar_tools.schema.yml b/web/modules/admin_toolbar/admin_toolbar_tools/config/schema/admin_toolbar_tools.schema.yml
new file mode 100644
index 0000000000..1280d38fb0
--- /dev/null
+++ b/web/modules/admin_toolbar/admin_toolbar_tools/config/schema/admin_toolbar_tools.schema.yml
@@ -0,0 +1,10 @@
+admin_toolbar_tools.settings:
+  type: config_object
+  label: 'Admin Toolbar Tools settings'
+  mapping:
+    max_bundle_number:
+      type: integer
+      label: 'Number of bundles per entity type to display'
+    hoverintent_functionality:
+      type: boolean
+      label: 'Enable or disable hoverintent functionality'
diff --git a/web/modules/admin_toolbar/admin_toolbar_tools/css/tools.css b/web/modules/admin_toolbar/admin_toolbar_tools/css/tools.css
index 708ea38fc6..9233a708da 100755
--- a/web/modules/admin_toolbar/admin_toolbar_tools/css/tools.css
+++ b/web/modules/admin_toolbar/admin_toolbar_tools/css/tools.css
@@ -18,6 +18,7 @@
 }
 
 .toolbar-icon-8 .toolbar-icon-admin-toolbar-tools-help:before {
+  box-sizing: content-box;
   background-image: url(../misc/icons/ffffff/drupal-8-logo.svg);
   padding-bottom: 0;
   padding-left: 4px;
diff --git a/web/modules/admin_toolbar/admin_toolbar_tools/src/Controller/ToolbarController.php b/web/modules/admin_toolbar/admin_toolbar_tools/src/Controller/ToolbarController.php
index 22ccded1fc..dcb9d2b883 100755
--- a/web/modules/admin_toolbar/admin_toolbar_tools/src/Controller/ToolbarController.php
+++ b/web/modules/admin_toolbar/admin_toolbar_tools/src/Controller/ToolbarController.php
@@ -193,7 +193,7 @@ public function reloadPage() {
       return $request->server->get('HTTP_REFERER');
     }
     else {
-      return '/';
+      return base_path();
     }
   }
 
diff --git a/web/modules/admin_toolbar/admin_toolbar_tools/src/Form/AdminToolbarToolsSettingsForm.php b/web/modules/admin_toolbar/admin_toolbar_tools/src/Form/AdminToolbarToolsSettingsForm.php
new file mode 100644
index 0000000000..ecdb03fe5e
--- /dev/null
+++ b/web/modules/admin_toolbar/admin_toolbar_tools/src/Form/AdminToolbarToolsSettingsForm.php
@@ -0,0 +1,111 @@
+<?php
+
+namespace Drupal\admin_toolbar_tools\Form;
+
+use Drupal\Core\Cache\CacheBackendInterface;
+use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\Core\Form\ConfigFormBase;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Menu\MenuLinkManagerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Class AdminToolbarToolsSettingsForm.
+ *
+ * @package Drupal\admin_toolbar_tools\Form
+ */
+class AdminToolbarToolsSettingsForm extends ConfigFormBase {
+
+  /**
+   * The cache menu instance.
+   *
+   * @var \Drupal\Core\Cache\CacheBackendInterface
+   */
+  protected $cacheMenu;
+
+  /**
+   * The menu link manager instance.
+   *
+   * @var \Drupal\Core\Menu\MenuLinkManagerInterface
+   */
+  protected $menuLinkManager;
+
+  /**
+   * AdminToolbarToolsSettingsForm constructor.
+   *
+   * @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory
+   *   The factory for configuration objects.
+   * @param \Drupal\Core\Menu\MenuLinkManagerInterface $menuLinkManager
+   *   A menu link manager instance.
+   * @param \Drupal\Core\Cache\CacheBackendInterface $cacheMenu
+   *   A cache menu instance.
+   */
+  public function __construct(ConfigFactoryInterface $configFactory, MenuLinkManagerInterface $menuLinkManager, CacheBackendInterface $cacheMenu) {
+    parent::__construct($configFactory);
+    $this->cacheMenu = $cacheMenu;
+    $this->menuLinkManager = $menuLinkManager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('config.factory'),
+      $container->get('plugin.manager.menu.link'),
+      $container->get('cache.menu')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getEditableConfigNames() {
+    return [
+      'admin_toolbar_tools.settings',
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormId() {
+    return 'admin_toolbar_tools_settings';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, FormStateInterface $form_state) {
+    $config = $this->config('admin_toolbar_tools.settings');
+    $form['max_bundle_number'] = [
+      '#type' => 'number',
+      '#title' => $this->t('Maximum number of bundle sub-menus to display'),
+      '#description' => $this->t('Loading a large number of items can cause performance issues.'),
+      '#default_value' => $config->get('max_bundle_number'),
+    ];
+
+    $form['hoverintent_functionality'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('Enable/Disable the hoverintent functionality'),
+      '#description' => $this->t('Check it if you want to enable the hoverintent feature.'),
+      '#default_value' => $config->get('hoverintent_functionality'),
+    ];
+
+    return parent::buildForm($form, $form_state);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+    $this->config('admin_toolbar_tools.settings')
+      ->set('max_bundle_number', $form_state->getValue('max_bundle_number'))
+      ->set('hoverintent_functionality', $form_state->getValue('hoverintent_functionality'))
+      ->save();
+    parent::submitForm($form, $form_state);
+    $this->cacheMenu->invalidateAll();
+    $this->menuLinkManager->rebuild();
+  }
+
+}
diff --git a/web/modules/admin_toolbar/admin_toolbar_tools/src/Plugin/Derivative/ExtraLinks.php b/web/modules/admin_toolbar/admin_toolbar_tools/src/Plugin/Derivative/ExtraLinks.php
index e9d6de8f57..4d98f3e2b7 100755
--- a/web/modules/admin_toolbar/admin_toolbar_tools/src/Plugin/Derivative/ExtraLinks.php
+++ b/web/modules/admin_toolbar/admin_toolbar_tools/src/Plugin/Derivative/ExtraLinks.php
@@ -3,6 +3,7 @@
 namespace Drupal\admin_toolbar_tools\Plugin\Derivative;
 
 use Drupal\Component\Plugin\Derivative\DeriverBase;
+use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Extension\ThemeHandlerInterface;
@@ -19,8 +20,6 @@ class ExtraLinks extends DeriverBase implements ContainerDeriverInterface {
 
   use StringTranslationTrait;
 
-  const MAX_BUNDLE_NUMBER = 10;
-
   /**
    * The entity type manager.
    *
@@ -49,14 +48,22 @@ class ExtraLinks extends DeriverBase implements ContainerDeriverInterface {
    */
   protected $themeHandler;
 
+  /**
+   * The admin toolbar tools configuration.
+   *
+   * @var \Drupal\Core\Config\Config
+   */
+  protected $config;
+
   /**
    * {@inheritdoc}
    */
-  public function __construct(EntityTypeManagerInterface $entity_type_manager, ModuleHandlerInterface $module_handler, RouteProviderInterface $route_provider, ThemeHandlerInterface $theme_handler) {
+  public function __construct(EntityTypeManagerInterface $entity_type_manager, ModuleHandlerInterface $module_handler, RouteProviderInterface $route_provider, ThemeHandlerInterface $theme_handler, ConfigFactoryInterface $config_factory) {
     $this->entityTypeManager = $entity_type_manager;
     $this->moduleHandler = $module_handler;
     $this->routeProvider = $route_provider;
     $this->themeHandler = $theme_handler;
+    $this->config = $config_factory->get('admin_toolbar_tools.settings');
   }
 
   /**
@@ -67,7 +74,8 @@ public static function create(ContainerInterface $container, $base_plugin_id) {
       $container->get('entity_type.manager'),
       $container->get('module_handler'),
       $container->get('router.route_provider'),
-      $container->get('theme_handler')
+      $container->get('theme_handler'),
+      $container->get('config.factory')
     );
   }
 
@@ -76,6 +84,7 @@ public static function create(ContainerInterface $container, $base_plugin_id) {
    */
   public function getDerivativeDefinitions($base_plugin_definition) {
     $links = [];
+    $max_bundle_number = $this->config->get('max_bundle_number');
     $entity_types = $this->entityTypeManager->getDefinitions();
     $content_entities = [];
     foreach ($entity_types as $key => $entity_type) {
@@ -91,11 +100,10 @@ public function getDerivativeDefinitions($base_plugin_definition) {
     foreach ($content_entities as $entities) {
       $content_entity_bundle = $entities['content_entity_bundle'];
       $content_entity = $entities['content_entity'];
-      // We do not display more than 10 different bundles per entity type.
       $content_entity_bundle_storage = $this->entityTypeManager->getStorage($content_entity_bundle);
-      $bundles_ids = $content_entity_bundle_storage->getQuery()->pager(self::MAX_BUNDLE_NUMBER)->execute();
+      $bundles_ids = $content_entity_bundle_storage->getQuery()->pager($max_bundle_number)->execute();
       $bundles = $this->entityTypeManager->getStorage($content_entity_bundle)->loadMultiple($bundles_ids);
-      if (count($bundles) == self::MAX_BUNDLE_NUMBER && $this->routeExists('entity.' . $content_entity_bundle . '.collection')) {
+      if (count($bundles) == $max_bundle_number && $this->routeExists('entity.' . $content_entity_bundle . '.collection')) {
         $links[$content_entity_bundle . '.collection'] = [
           'title' => $this->t('All types'),
           'route_name' => 'entity.' . $content_entity_bundle . '.collection',
@@ -111,22 +119,33 @@ public function getDerivativeDefinitions($base_plugin_definition) {
           // link.
           $content_entity_bundle_root = 'entity.' . $content_entity_bundle . '.overview_form.' . $machine_name;
           $links[$content_entity_bundle_root] = [
-            'title' => $this->t('@label', ['@label' => $bundle->label()]),
             'route_name' => 'entity.' . $content_entity_bundle . '.overview_form',
             'parent' => 'entity.' . $content_entity_bundle . '.collection',
             'route_parameters' => [$content_entity_bundle => $machine_name],
+            'class' => 'Drupal\admin_toolbar_tools\Plugin\Menu\MenuLinkEntity',
+            'metadata' => [
+              'entity_type' => $bundle->getEntityTypeId(),
+              'entity_id' => $bundle->id(),
+            ],
           ] + $base_plugin_definition;
         }
         if ($this->routeExists('entity.' . $content_entity_bundle . '.edit_form')) {
           $key = 'entity.' . $content_entity_bundle . '.edit_form.' . $machine_name;
           $links[$key] = [
-            'title' => $this->t('@label', ['@label' => $bundle->label()]),
             'route_name' => 'entity.' . $content_entity_bundle . '.edit_form',
             'parent' => 'entity.' . $content_entity_bundle . '.collection',
             'route_parameters' => [$content_entity_bundle => $machine_name],
           ] + $base_plugin_definition;
           if (empty($content_entity_bundle_root)) {
             $content_entity_bundle_root = $key;
+            $links[$key]['parent'] = 'entity.' . $content_entity_bundle . '.collection';
+
+            // When not grouped by bundle, use bundle name as title.
+            $links[$key]['class'] = 'Drupal\admin_toolbar_tools\Plugin\Menu\MenuLinkEntity';
+            $links[$key]['metadata'] = [
+              'entity_type' => $bundle->getEntityTypeId(),
+              'entity_id' => $bundle->id(),
+            ];
           }
           else {
             $links[$key]['parent'] = $base_plugin_definition['id'] . ':' . $content_entity_bundle_root;
@@ -209,7 +228,7 @@ public function getDerivativeDefinitions($base_plugin_definition) {
       'title' => $this->t('Add role'),
       'route_name' => 'user.role_add',
       'parent' => $base_plugin_definition['id'] . ':entity.user_role.collection',
-      'weight' => -5,
+      'weight' => -50,
     ] + $base_plugin_definition;
     // Adds sub-links to Account settings link.
     if ($this->moduleHandler->moduleExists('field_ui')) {
@@ -235,10 +254,15 @@ public function getDerivativeDefinitions($base_plugin_definition) {
 
     foreach ($this->entityTypeManager->getStorage('user_role')->loadMultiple() as $role) {
       $links['entity.user_role.edit_form.' . $role->id()] = [
-        'title' => $this->t('@label', ['@label' => $role->label()]),
         'route_name' => 'entity.user_role.edit_form',
         'parent' => $base_plugin_definition['id'] . ':entity.user_role.collection',
+        'weight' => $role->getWeight(),
         'route_parameters' => ['user_role' => $role->id()],
+        'class' => 'Drupal\admin_toolbar_tools\Plugin\Menu\MenuLinkEntity',
+        'metadata' => [
+          'entity_type' => $role->getEntityTypeId(),
+          'entity_id' => $role->id(),
+        ],
       ] + $base_plugin_definition;
       $links['entity.user_role.edit_permissions_form.' . $role->id()] = [
         'title' => $this->t('Edit permissions'),
@@ -279,10 +303,14 @@ public function getDerivativeDefinitions($base_plugin_definition) {
       // Adds node links for each content type.
       foreach ($this->entityTypeManager->getStorage('node_type')->loadMultiple() as $type) {
         $links['node.add.' . $type->id()] = [
-          'title' => $this->t('@label', ['@label' => $type->label()]),
           'route_name' => 'node.add',
           'parent' => $base_plugin_definition['id'] . ':node.add',
           'route_parameters' => ['node_type' => $type->id()],
+          'class' => 'Drupal\admin_toolbar_tools\Plugin\Menu\MenuLinkEntity',
+          'metadata' => [
+            'entity_type' => $type->getEntityTypeId(),
+            'entity_id' => $type->id(),
+          ],
         ] + $base_plugin_definition;
       }
     }
@@ -317,11 +345,10 @@ public function getDerivativeDefinitions($base_plugin_definition) {
         'weight' => -2,
       ] + $base_plugin_definition;
       // Adds links to /admin/structure/menu.
-      // We do not display more than 10 different menus.
       $menus = $this->entityTypeManager->getStorage('menu')->loadMultiple();
       uasort($menus, [Menu::class, 'sort']);
-      $menus = array_slice($menus, 0, self::MAX_BUNDLE_NUMBER);
-      if (count($menus) == self::MAX_BUNDLE_NUMBER) {
+      $menus = array_slice($menus, 0, $max_bundle_number);
+      if (count($menus) == $max_bundle_number) {
         $links['entity.menu.collection'] = [
           'title' => $this->t('All menus'),
           'route_name' => 'entity.menu.collection',
@@ -332,11 +359,15 @@ public function getDerivativeDefinitions($base_plugin_definition) {
       $weight = 0;
       foreach ($menus as $menu_id => $menu) {
         $links['entity.menu.edit_form.' . $menu_id] = [
-          'title' => $menu->label(),
           'route_name' => 'entity.menu.edit_form',
           'parent' => 'entity.menu.collection',
           'route_parameters' => ['menu' => $menu_id],
           'weight' => $weight,
+          'class' => 'Drupal\admin_toolbar_tools\Plugin\Menu\MenuLinkEntity',
+          'metadata' => [
+            'entity_type' => $menu->getEntityTypeId(),
+            'entity_id' => $menu->id(),
+          ],
         ] + $base_plugin_definition;
         $links['entity.menu.add_link_form.' . $menu_id] = [
           'title' => $this->t('Add link'),
@@ -554,6 +585,13 @@ public function getDerivativeDefinitions($base_plugin_definition) {
         'route_name' => 'entity.media.collection',
         'parent' => 'system.admin_content',
       ] + $base_plugin_definition;
+      if ($this->moduleHandler->moduleExists('media_library')) {
+        $links['media_library'] = [
+            'title' => $this->t('Media library'),
+            'route_name' => 'view.media_library.page',
+            'parent' => $base_plugin_definition['id'] . ':media_page',
+          ] + $base_plugin_definition;
+      }
       $links['add_media'] = [
         'title' => $this->t('Add media'),
         'route_name' => 'entity.media.add_page',
@@ -562,10 +600,14 @@ public function getDerivativeDefinitions($base_plugin_definition) {
       // Adds links for each media type.
       foreach ($this->entityTypeManager->getStorage('media_type')->loadMultiple() as $type) {
         $links['media.add.' . $type->id()] = [
-          'title' => $type->label(),
           'route_name' => 'entity.media.add_form',
           'parent' => $base_plugin_definition['id'] . ':add_media',
           'route_parameters' => ['media_type' => $type->id()],
+          'class' => 'Drupal\admin_toolbar_tools\Plugin\Menu\MenuLinkEntity',
+          'metadata' => [
+            'entity_type' => $type->getEntityTypeId(),
+            'entity_id' => $type->id(),
+          ],
         ] + $base_plugin_definition;
       }
     }
diff --git a/web/modules/admin_toolbar/admin_toolbar_tools/src/Plugin/Menu/MenuLinkEntity.php b/web/modules/admin_toolbar/admin_toolbar_tools/src/Plugin/Menu/MenuLinkEntity.php
new file mode 100644
index 0000000000..195837a198
--- /dev/null
+++ b/web/modules/admin_toolbar/admin_toolbar_tools/src/Plugin/Menu/MenuLinkEntity.php
@@ -0,0 +1,107 @@
+<?php
+
+namespace Drupal\admin_toolbar_tools\Plugin\Menu;
+
+use Drupal\Core\Entity\EntityDescriptionInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Menu\MenuLinkDefault;
+use Drupal\Core\Menu\StaticMenuLinkOverridesInterface;
+use Drupal\node\NodeTypeInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Provides a menu link plugins for configuration entities.
+ */
+class MenuLinkEntity extends MenuLinkDefault {
+
+  /**
+   * The entity represented in the menu link.
+   *
+   * @var \Drupal\Core\Entity\EntityInterface
+   */
+  protected $entity;
+
+  /**
+   * Constructs a new MenuLinkEntity.
+   *
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin_id for the plugin instance.
+   * @param mixed $plugin_definition
+   *   The plugin implementation definition.
+   * @param \Drupal\Core\Menu\StaticMenuLinkOverridesInterface $static_override
+   *   The static override storage.
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
+   *   The entity type manager.
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, StaticMenuLinkOverridesInterface $static_override, EntityTypeManagerInterface $entity_type_manager) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition, $static_override);
+    $this->entity = $entity_type_manager->getStorage($this->pluginDefinition['metadata']['entity_type'])->load($this->pluginDefinition['metadata']['entity_id']);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('menu_link.static.overrides'),
+      $container->get('entity_type.manager')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getTitle() {
+    if ($this->entity) {
+      return (string) $this->entity->label();
+    }
+    return $this->pluginDefinition['title'] ?: $this->t('Missing');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDescription() {
+    // @todo Remove node_type special handling.
+    if ($this->entity instanceof EntityDescriptionInterface || $this->entity instanceof NodeTypeInterface) {
+      return $this->entity->getDescription();
+    }
+    return parent::getDescription();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCacheContexts() {
+    if ($this->entity) {
+      return $this->entity->getCacheContexts();
+    }
+    return parent::getCacheContexts();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCacheTags() {
+    if ($this->entity) {
+      return $this->entity->getCacheTags();
+    }
+    return parent::getCacheTags();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCacheMaxAge() {
+    if ($this->entity) {
+      return $this->entity->getCacheMaxAge();
+    }
+    return parent::getCacheMaxAge();
+  }
+
+}
diff --git a/web/modules/admin_toolbar/admin_toolbar_tools/tests/src/Functional/AdminToolbarToolsAlterTest.php b/web/modules/admin_toolbar/admin_toolbar_tools/tests/src/Functional/AdminToolbarToolsAlterTest.php
index 9669a49a5f..3e9a7cdcd7 100755
--- a/web/modules/admin_toolbar/admin_toolbar_tools/tests/src/Functional/AdminToolbarToolsAlterTest.php
+++ b/web/modules/admin_toolbar/admin_toolbar_tools/tests/src/Functional/AdminToolbarToolsAlterTest.php
@@ -37,7 +37,7 @@ class AdminToolbarToolsAlterTest extends BrowserTestBase {
   /**
    * {@inheritdoc}
    */
-  protected function setUp() {
+  protected function setUp(): void {
     parent::setUp();
     // Create and log in an administrative user.
     $this->adminUser = $this->drupalCreateUser([
diff --git a/web/modules/admin_toolbar/css/admin.toolbar.css b/web/modules/admin_toolbar/css/admin.toolbar.css
index a04575263a..a04b172125 100755
--- a/web/modules/admin_toolbar/css/admin.toolbar.css
+++ b/web/modules/admin_toolbar/css/admin.toolbar.css
@@ -8,7 +8,7 @@
 
 .toolbar-tray-horizontal .toolbar-menu:not(:first-child) li.menu-item--expanded > a:focus {
   background-position: center right;
-  background-image: url('../misc/icons/0074bd/chevron-right.svg');
+  background-image: url(../misc/icons/0074bd/chevron-right.svg);
   background-repeat: no-repeat;
 }
 
@@ -24,18 +24,18 @@
 
 .toolbar-tray-horizontal ul li li.menu-item {
   border-top: none transparent;
-  border-right: 1px solid #dddddd;
-  border-bottom: 1px solid #dddddd;
-  border-left: 1px solid #dddddd;
+  border-right: 1px solid #ddd;
+  border-bottom: 1px solid #ddd;
+  border-left: 1px solid #ddd;
 }
 
 .toolbar .toolbar-tray-horizontal .menu-item:last-child {
-  border-left: 1px solid #dddddd;
-  border-right: 1px solid #dddddd;
+  border-left: 1px solid #ddd;
+  border-right: 1px solid #ddd;
 }
 
 .toolbar .toolbar-tray-horizontal ul ul li.menu-item:first-child {
-  border-top: 1px solid #dddddd;
+  border-top: 1px solid #ddd;
 }
 
 .toolbar-tray-horizontal li.menu-item--expanded.hover-intent ul ul,
@@ -65,7 +65,7 @@
   display: block;
   position: absolute;
   width: 200px;
-  box-shadow: 2px 2px 3px hsla(0, 0%, 0%, 0.4);
+  box-shadow: 2px 2px 3px hsla(0, 0, 0, 0.4);
   z-index: 1;
 }
 
@@ -75,7 +75,7 @@
 
 .toolbar-tray-horizontal ul li.menu-item--expanded ul li.menu-item--expanded {
   background-position: center right;
-  background-image: url('../misc/icons/0074bd/chevron-right.svg');
+  background-image: url(../misc/icons/0074bd/chevron-right.svg);
   background-repeat: no-repeat;
 }
 
@@ -121,7 +121,7 @@
 
 [dir="rtl"] .toolbar-tray-horizontal .toolbar-menu:not(:first-child) li.menu-item--expanded > a:focus {
   background-position: center right;
-  background-image: url('../misc/icons/0074bd/chevron-right.svg');
+  background-image: url(../misc/icons/0074bd/chevron-right.svg);
   background-repeat: no-repeat;
 }
 
@@ -137,18 +137,18 @@
 
 [dir="rtl"] .toolbar-tray-horizontal ul li li.menu-item {
   border-top: none transparent;
-  border-right: 1px solid #dddddd;
-  border-bottom: 1px solid #dddddd;
-  border-left: 1px solid #dddddd;
+  border-right: 1px solid #ddd;
+  border-bottom: 1px solid #ddd;
+  border-left: 1px solid #ddd;
 }
 
 [dir="rtl"] .toolbar .toolbar-tray-horizontal .menu-item:last-child {
-  border-left: 1px solid #dddddd;
-  border-right: 1px solid #dddddd;
+  border-left: 1px solid #ddd;
+  border-right: 1px solid #ddd;
 }
 
 [dir="rtl"] .toolbar .toolbar-tray-horizontal ul ul li.menu-item:first-child {
-  border-top: 1px solid #dddddd;
+  border-top: 1px solid #ddd;
 }
 
 [dir="rtl"] .toolbar-tray-horizontal li.menu-item--expanded.hover-intent ul ul,
@@ -178,7 +178,7 @@
   display: block;
   position: absolute;
   width: 200px;
-  box-shadow: 2px 2px 3px hsla(0, 0%, 0%, 0.4);
+  box-shadow: 2px 2px 3px hsla(0, 0, 0, 0.4);
   z-index: 1;
 }
 
@@ -188,7 +188,7 @@
 
 [dir="rtl"] .toolbar-tray-horizontal ul li.menu-item--expanded ul li.menu-item--expanded {
   background-position: center left;
-  background-image: url('../misc/icons/0074bd/chevron-left.svg');
+  background-image: url(../misc/icons/0074bd/chevron-left.svg);
   background-repeat: no-repeat;
 }
 
diff --git a/web/modules/admin_toolbar/css/admin.toolbar_search.css b/web/modules/admin_toolbar/css/admin.toolbar_search.css
index bd99553855..115c0c2fde 100755
--- a/web/modules/admin_toolbar/css/admin.toolbar_search.css
+++ b/web/modules/admin_toolbar/css/admin.toolbar_search.css
@@ -3,17 +3,17 @@
 }
 
 #admin-toolbar-search-tab .toolbar-item:before {
-  background-image: url('../misc/icons/bebebe/loupe.svg');
+  background-image: url(../misc/icons/bebebe/loupe.svg);
 }
 
 #admin-toolbar-search-tab .toolbar-item:active:before,
 #admin-toolbar-search-tab .toolbar-item.is-active:before {
-  background-image: url('../misc/icons/ffffff/loupe.svg');
+  background-image: url(../misc/icons/ffffff/loupe.svg);
 }
 
 #toolbar-item-administration-search-tray label {
   display: inline-block;
-  color: #000000;
+  color: #000;
   margin-right: .5em;
   font-weight: bold;
 }
@@ -29,5 +29,5 @@
 }
 
 .ui-autocomplete .ui-menu-item span.admin-toolbar-search-url {
-  color: rgba(0, 0, 0, 0.50);
+  color: rgba(0, 0, 0, 0.5);
 }
diff --git a/web/modules/admin_toolbar/js/admin_toolbar.hover.js b/web/modules/admin_toolbar/js/admin_toolbar.hover.js
new file mode 100644
index 0000000000..11da3cd844
--- /dev/null
+++ b/web/modules/admin_toolbar/js/admin_toolbar.hover.js
@@ -0,0 +1,13 @@
+(function ($) {
+  $(document).ready(function () {
+    $('.toolbar-tray.is-active.toolbar-tray-horizontal .menu-item.menu-item--expanded').hover(function () {
+      // At the current depth, we should delete all "hover-intent" classes.
+      // Other wise we get unwanted behaviour where menu items are expanded while already in hovering other ones.
+      $(this).parent().find('li').removeClass('hover-intent');
+      $(this).addClass('hover-intent');
+    },
+      function () {
+        $(this).removeClass('hover-intent');
+      });
+  });
+})(jQuery);
diff --git a/web/modules/admin_toolbar/js/admin_toolbar.hoverintent.js b/web/modules/admin_toolbar/js/admin_toolbar.hoverintent.js
new file mode 100644
index 0000000000..955e3bcbab
--- /dev/null
+++ b/web/modules/admin_toolbar/js/admin_toolbar.hoverintent.js
@@ -0,0 +1,16 @@
+(function ($) {
+  $(document).ready(function () {
+    $('.toolbar-tray-horizontal li.menu-item--expanded, .toolbar-tray-horizontal ul li.menu-item--expanded .menu-item').hoverIntent({
+      over: function () {
+        // At the current depth, we should delete all "hover-intent" classes.
+        // Other wise we get unwanted behaviour where menu items are expanded while already in hovering other ones.
+        $(this).parent().find('li').removeClass('hover-intent');
+        $(this).addClass('hover-intent');
+      },
+      out: function () {
+        $(this).removeClass('hover-intent');
+      },
+      timeout: 250
+    });
+  });
+})(jQuery);
diff --git a/web/modules/admin_toolbar/js/admin_toolbar.js b/web/modules/admin_toolbar/js/admin_toolbar.js
index 2458c32d86..6e2a7af171 100755
--- a/web/modules/admin_toolbar/js/admin_toolbar.js
+++ b/web/modules/admin_toolbar/js/admin_toolbar.js
@@ -4,19 +4,6 @@
 
       $('a.toolbar-icon', context).removeAttr('title');
 
-      $('.toolbar-tray li.menu-item--expanded, .toolbar-tray ul li.menu-item--expanded .menu-item', context).hoverIntent({
-        over: function () {
-          // At the current depth, we should delete all "hover-intent" classes.
-          // Other wise we get unwanted behaviour where menu items are expanded while already in hovering other ones.
-          $(this).parent().find('li').removeClass('hover-intent');
-          $(this).addClass('hover-intent');
-        },
-        out: function () {
-          $(this).removeClass('hover-intent');
-        },
-        timeout: 250
-      });
-
       // Make the toolbar menu navigable with keyboard.
       $('ul.toolbar-menu li.menu-item--expanded a', context).on('focusin', function () {
         $('li.menu-item--expanded', context).removeClass('hover-intent');
diff --git a/web/modules/admin_toolbar/tests/src/Functional/AdminToolbarAlterTest.php b/web/modules/admin_toolbar/tests/src/Functional/AdminToolbarAlterTest.php
index c17f575ee5..28ba1831fd 100755
--- a/web/modules/admin_toolbar/tests/src/Functional/AdminToolbarAlterTest.php
+++ b/web/modules/admin_toolbar/tests/src/Functional/AdminToolbarAlterTest.php
@@ -37,7 +37,7 @@ class AdminToolbarAlterTest extends BrowserTestBase {
   /**
    * {@inheritdoc}
    */
-  protected function setUp() {
+  protected function setUp(): void {
     parent::setUp();
 
     // Create and log in an administrative user.
diff --git a/web/modules/admin_toolbar/tests/src/Functional/AdminToolbarToolsSortTest.php b/web/modules/admin_toolbar/tests/src/Functional/AdminToolbarToolsSortTest.php
index 8da6ca9ae2..4a54a79de1 100644
--- a/web/modules/admin_toolbar/tests/src/Functional/AdminToolbarToolsSortTest.php
+++ b/web/modules/admin_toolbar/tests/src/Functional/AdminToolbarToolsSortTest.php
@@ -120,18 +120,23 @@ public function testMenuSorting() {
     ]);
 
     $menus = [
-      'aaa' => 'lll',
-      'bbb' => 'kkk',
-      'ccc' => 'jjj',
-      'ddd' => 'iii',
-      'eee' => 'hhh',
-      'fff' => 'ggg',
-      'ggg' => 'fff',
-      'hhh' => 'eee',
-      'iii' => 'ddd',
-      'jjj' => 'ccc',
-      'kkk' => 'bbb',
-      'lll' => 'aaa',
+      'aaa' => 'qqq',
+      'bbb' => 'ppp',
+      'ccc' => 'ooo',
+      'ddd' => 'nnn',
+      'eee' => 'mmm',
+      'fff' => 'lll',
+      'ggg' => 'kkk',
+      'hhh' => 'jjj',
+      'iii' => 'iii',
+      'jjj' => 'hhh',
+      'kkk' => 'ggg',
+      'lll' => 'fff',
+      'mmm' => 'eee',
+      'nnn' => 'ddd',
+      'ooo' => 'ccc',
+      'ppp' => 'bbb',
+      'qqq' => 'aaa',
     ];
 
     foreach ($menus as $machine_name => $label) {
@@ -155,39 +160,68 @@ public function testMenuSorting() {
     }
 
     $expected = [
-      0 => '/admin/structure/menu/manage/lll',
-      1 => '/admin/structure/menu/manage/lll/add',
-      2 => '/admin/structure/menu/manage/lll/delete',
+      0 => '/admin/structure/menu/manage/qqq',
+      1 => '/admin/structure/menu/manage/qqq/add',
+      2 => '/admin/structure/menu/manage/qqq/delete',
       3 => '/admin/structure/menu/manage/admin',
       4 => '/admin/structure/menu/manage/admin/add',
-      5 => '/admin/structure/menu/manage/kkk',
-      6 => '/admin/structure/menu/manage/kkk/add',
-      7 => '/admin/structure/menu/manage/kkk/delete',
-      8 => '/admin/structure/menu/manage/jjj',
-      9 => '/admin/structure/menu/manage/jjj/add',
-      10 => '/admin/structure/menu/manage/jjj/delete',
-      11 => '/admin/structure/menu/manage/iii',
-      12 => '/admin/structure/menu/manage/iii/add',
-      13 => '/admin/structure/menu/manage/iii/delete',
-      14 => '/admin/structure/menu/manage/hhh',
-      15 => '/admin/structure/menu/manage/hhh/add',
-      16 => '/admin/structure/menu/manage/hhh/delete',
-      17 => '/admin/structure/menu/manage/ggg',
-      18 => '/admin/structure/menu/manage/ggg/add',
-      19 => '/admin/structure/menu/manage/ggg/delete',
+      5 => '/admin/structure/menu/manage/ppp',
+      6 => '/admin/structure/menu/manage/ppp/add',
+      7 => '/admin/structure/menu/manage/ppp/delete',
+      8 => '/admin/structure/menu/manage/ooo',
+      9 => '/admin/structure/menu/manage/ooo/add',
+      10 => '/admin/structure/menu/manage/ooo/delete',
+      11 => '/admin/structure/menu/manage/nnn',
+      12 => '/admin/structure/menu/manage/nnn/add',
+      13 => '/admin/structure/menu/manage/nnn/delete',
+      14 => '/admin/structure/menu/manage/mmm',
+      15 => '/admin/structure/menu/manage/mmm/add',
+      16 => '/admin/structure/menu/manage/mmm/delete',
+      17 => '/admin/structure/menu/manage/lll',
+      18 => '/admin/structure/menu/manage/lll/add',
+      19 => '/admin/structure/menu/manage/lll/delete',
       20 => '/admin/structure/menu/manage/footer',
       21 => '/admin/structure/menu/manage/footer/add',
-      22 => '/admin/structure/menu/manage/fff',
-      23 => '/admin/structure/menu/manage/fff/add',
-      24 => '/admin/structure/menu/manage/fff/delete',
-      25 => '/admin/structure/menu/manage/eee',
-      26 => '/admin/structure/menu/manage/eee/add',
-      27 => '/admin/structure/menu/manage/eee/delete',
+      22 => '/admin/structure/menu/manage/kkk',
+      23 => '/admin/structure/menu/manage/kkk/add',
+      24 => '/admin/structure/menu/manage/kkk/delete',
+      25 => '/admin/structure/menu/manage/jjj',
+      26 => '/admin/structure/menu/manage/jjj/add',
+      27 => '/admin/structure/menu/manage/jjj/delete',
+      28 => '/admin/structure/menu/manage/iii',
+      29 => '/admin/structure/menu/manage/iii/add',
+      30 => '/admin/structure/menu/manage/iii/delete',
+      31 => '/admin/structure/menu/manage/hhh',
+      32 => '/admin/structure/menu/manage/hhh/add',
+      33 => '/admin/structure/menu/manage/hhh/delete',
+      34 => '/admin/structure/menu/manage/ggg',
+      35 => '/admin/structure/menu/manage/ggg/add',
+      36 => '/admin/structure/menu/manage/ggg/delete',
+      37 => '/admin/structure/menu/manage/fff',
+      38 => '/admin/structure/menu/manage/fff/add',
+      39 => '/admin/structure/menu/manage/fff/delete',
+      40 => '/admin/structure/menu/manage/main',
+      41 => '/admin/structure/menu/manage/main/add',
+      42 => '/admin/structure/menu/manage/eee',
+      43 => '/admin/structure/menu/manage/eee/add',
+      44 => '/admin/structure/menu/manage/eee/delete',
+      45 => '/admin/structure/menu/manage/ddd',
+      46 => '/admin/structure/menu/manage/ddd/add',
+      47 => '/admin/structure/menu/manage/ddd/delete',
+      48 => '/admin/structure/menu/manage/ccc',
+      49 => '/admin/structure/menu/manage/ccc/add',
+      50 => '/admin/structure/menu/manage/ccc/delete',
+      51 => '/admin/structure/menu/manage/bbb',
+      52 => '/admin/structure/menu/manage/bbb/add',
+      53 => '/admin/structure/menu/manage/bbb/delete',
+      54 => '/admin/structure/menu/manage/aaa',
+      55 => '/admin/structure/menu/manage/aaa/add',
+      56 => '/admin/structure/menu/manage/aaa/delete',
     ];
 
     foreach ($links as $key => $link) {
       // Using assert contains because prefaces the urls with "/subdirectory".
-      $this->assertContains($expected[$key], $link);
+      $this->assertStringContainsString($expected[$key], $link);
     }
   }
 
-- 
GitLab