<nav class="site-menu" role="navigation" aria-label="Main Navigation">

  <ul class="nav">
    <!-- 1er niveau de navigation -->
    <li id="menu-item-1" class="menu-item current-menu-item">
      <a href="home" aria-current="page">Homepage</a>
    </li>
    <li id="menu-item-2" class="menu-item menu-item-has-children">
      <a href="#">About</a>
      <!-- sous-menu -->
      <ul class="sub-menu">
        <li id="menu-item-3" class="menu-item"><a href="team">Our team</a></li>
        <li id="menu-item-4" class="menu-item"><a href="references">Company history</a></li>
        <li id="menu-item-5" class="menu-item"><a href="references">References</a></li>
      </ul>
    </li>
    <li id="menu-item-6" class="menu-item"><a href="services">Services</a></li>
    <li id="menu-item-7" class="menu-item menu-item-has-children">
      <a href="blog">Blog</a>
      <!-- sous-menu -->
      <ul class="sub-menu">
        <li id="menu-item-8" class="menu-item"><a href="category-1">Category 1</a></li>
        <li id="menu-item-9" class="menu-item"><a href="category-2">Category 2</a></li>
      </ul>
    </li>
    <li id="menu-item-10" class="menu-item"><a href="contact">Contact</a></li>
  </ul>

</nav>
/** I'm using SCSS for this demo. You can access the CSS by clicking the "View Complied CSS" button at the top right of the CSS panel **/

/* Reset, base styles and helper classes */

* {
  border: 0;
  box-sizing: border-box;
  font-family: Arial;
  margin: 0;
  padding: 0;
}

body {
  padding: 2rem;
}

.sr-only:not(:focus):not(:active) {
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  height: 1px;
  overflow: hidden;
  position: absolute;
  white-space: nowrap;
  width: 1px;
}

button {
  -webkit-appearance: button;
  background: transparent;
  border: 0;
  font-family: inherit;
  font-size: 100%;
  line-height: 1;
  overflow: visible;
  margin: 0;
  text-transform: none;
}

button,
a {
  &:focus,
  &:focus-visible {
    outline: 2px solid currentColor;
    outline-offset: 2px;
  }

  &:focus:not(:focus-visible) {
    outline-color: transparent;
  }
}

/* Menu styles */

.site-menu {
  background: #28223b;
  border-radius: 0.5rem;
  color: #fff;
  padding: 1.5rem 2rem;
}

ul.nav {
  display: flex;
  list-style: none;

  & > li {
    display: flex;
    align-items: center;
    margin-left: 1em;
    padding: 0.5em 0;
    position: relative;
  }
  li a,
  li button.toggle-sub-menu:first-child {
    border-radius: 0.125rem;
    color: #fff;
    padding: 0.25rem;
    text-decoration-color: transparent;
    text-underline-offset: 0.3em;
    transition: text-decoration-color 0.2s ease-in-out;
  }
}

/* Sub menu */

ul.sub-menu {
  background: #fff;
  border-radius: 0.25rem;
  box-shadow: 0 0.125rem 1rem rgba(0, 0, 0, 0.12);
  display: none;
  list-style: none;
  padding: 0.75rem;
  position: absolute;
  left: -0.75rem;
  top: 2.5em;

  li {
    display: block;
  }
  li + li {
    margin-top: 0.75rem;
  }
  li a {
    color: #222;
    white-space: nowrap;
  }
}

ul.nav > li.menu-item-has-children:hover .sub-menu,
ul.nav > li.menu-item-has-children:focus-within .sub-menu:not(.hidden) {
  display: block;
}

ul.sub-menu.show {
  display: block;
}

/* Sub-menu toggle buttons */

button.toggle-sub-menu {
  display: flex;
  align-items: center;

  border: 0;
  color: #fff;
}

.toggle-sub-menu .icon {
  background: #fff;
  border-radius: 50%;
  height: 1.375rem;
  line-height: 1.5rem;
  margin-left: 0.5rem;
  width: 1.375rem;
}

a + button.toggle-sub-menu {
  border-radius: 50%;
  margin-left: 0.25rem;
  padding: 0;
  pointer-events: none;

  .icon {
    margin: 0;
  }
}

.toggle-sub-menu .icon {
  color: #28223b;
  text-align: center;
  transition: all ease-in-out 0.3s;
}

.toggle-sub-menu.close .icon {
  transform: rotate(180deg);
}

.toggle-sub-menu .icon:before {
  font-size: 0.875rem;
}
View Compiled
jQuery(document).ready(function(jQuery){

  function createExpandSubMenuButton() {
    const menuItemsWithChildren = $(".menu-item-has-children");

    menuItemsWithChildren.each(function () {

      const link = $(this).children("a"),
            linkLabel = link.text(),
            linkMenuItemID = $(this).attr("id"),
            subMenu = $(this).find(".sub-menu"),
            subMenuID = linkMenuItemID + "-sub-menu";

      $(this).addClass("has-dropdown-button");

      subMenu.attr("id", subMenuID);
      subMenu.addClass("hidden");

      // Create 'toggle-sub-menu' button
      const expandSubMenu = document.createElement("button");
      expandSubMenu.innerHTML = '<span class="sr-only">Sub-menu '  + linkLabel + '</span>';
      expandSubMenu.innerHTML += '<span class="icon fa-solid fa-angle-down" aria-hidden="true"></span>';
      expandSubMenu.className = "toggle-sub-menu";
      expandSubMenu.setAttribute('aria-expanded', false);
      expandSubMenu.setAttribute('aria-controls', subMenuID);
      link.after(expandSubMenu);   
    });
  }
  createExpandSubMenuButton();

  // When primary link is a placeholder (#), turn it into a button

  function transformEmptyNavLinksIntoButtons() {

    const emptyNavLinks = $('.site-menu .menu-item-has-children a[href="#"]');

    emptyNavLinks.each(function(){
      const link = $(this),
            linkHTML = link[0].innerHTML,
            linkLabel = link.text(),
            linkDropdown = link.siblings('.sub-menu'),
            linkMenuItemID = link.parent('.menu-item').attr('id'),
            subMenuID = linkMenuItemID + '-sub-menu',
            buttonAriaLabel = 'Sub-menu ' + linkLabel;

      // Remove the initial 'toggle-sub-menu' button
      link.siblings('.toggle-sub-menu').remove();

      // Create button
      const button = document.createElement('button');
            button.innerHTML = linkHTML + '<span class="icon fa-solid fa-angle-down" aria-hidden="true"></span>';
            button.className = 'btn toggle-sub-menu';
            button.setAttribute('aria-controls', subMenuID);
            button.setAttribute('aria-expanded', false);
            button.setAttribute('aria-label', buttonAriaLabel);

      // Replace # link with button
      link.replaceWith(button);
    });

  } transformEmptyNavLinksIntoButtons();

  // Show and hide sub-menu when 'toggle-sub-menu' and 'toggle-dropdown' buttons are 

  function toggleSubMenu(){
    const subMenuToggles = $(".menu-item-has-children .toggle-sub-menu");

    subMenuToggles.click(function(){
      const dropdown = $(this).siblings('.sub-menu');
      const parentSiblings = $(this).parents('.menu-item').siblings('.menu-item-has-children.has-dropdown-button');
      dropdown.toggleClass("show").toggleClass("hidden");

      $(this).attr('aria-expanded', $(this).attr('aria-expanded') == 'false' ? 'true' : 'false' );
      $(this).toggleClass("close");

      // Close other dropdowns
      parentSiblings.find('.sub-menu').removeClass('show').addClass('hidden');
      parentSiblings.find('.toggle-sub-menu').removeClass("close");
    });

    // Close dropdown after last link

    const firstLevelMenuLinks = $(".site-menu .nav > .menu-item").children("a, .toggle-sub-menu");

    firstLevelMenuLinks.on( "focus", function() {
      var siblingsSubMenu = $(this).parents('.menu-item').siblings('.menu-item-has-children.has-dropdown-button').find('.sub-menu');
      siblingsSubMenu.removeClass('show').addClass('hidden');
      siblingsSubMenu.siblings('.toggle-sub-menu').attr('aria-expanded','false').removeClass('close');
    });

  } toggleSubMenu();
  
});

External CSS

  1. https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js